2011-12-14 19 views
0

將事務性置於下面的訪問下面的MySQL數據庫的以下C#db讀取代碼的最佳方式是什麼?也許更重要的問題是「有沒有什麼需要沒有把事務性周圍單個讀取聲明」什麼是最好的方式(我需要)把交易性放在這個C#MySQL數據訪問代碼中?

public List<Item> RunQuery(DateTime runDate) 
    { 
     var connection = new MySqlConnection(CONNECTION_STRING); 
     connection.Open(); 
     string query = "select * from MyTable order by name"; 
     var cmd = new MySqlCommand(query, connection); 
     MySqlDataReader myReader = cmd.ExecuteReader(); 
     var items = new List<Item>(); 
     try 
     { 
      while (myReader.Read()) 
      { 
       items.Add(new Item 
       { 
        Name = myReader.GetString("name"), 
        Date = myReader.GetDateTime("date") 
       }); 
      } 
     } 
     finally 
     { 
      myReader.Close(); 
      connection.Close(); 
     } 
     return items; 
    } 
+1

爲什麼你需要一個只讀操作的交易? – 2011-12-14 19:17:01

回答

2

由於尼廷閔毅達提到的,也沒有必要使用事務時,你只讀取數據,或者即使你的代碼更新數據,但只有一個數據庫訪問權限(即,調用一個SP來完成插入,更新和刪除)。 儘管如此,事務應儘可能原子化,因此它們應該在第一次數據庫更新訪問之前立即創建,並在最後一次之後立即創建。如果它位於try catch塊中,則可以在try之前定義de事務變量,然後在try內部需要時打開它,然後在catch部分詢問事務!= null,如果是,則回滾。提交將在try塊中。

例如:

 DbTransaction tx = null; 
     try 
     { 
      tx = Connection.CreateTransaction(); 
      Connection.ExecuteNonQuery(tx, "SPNameOrSQLInstruction", new object[] { param1, param2 }); 
      tx.Commit(); 
     } 
     catch (Exception ex) 
     { 
      if(tx != null) 
       tx.Rollback(); 
      Logger.Log (ex); 
     } 
+0

我更喜歡使用...`使用`(通常是`TransactionScope`)。我認爲未能創建transactin作爲更高級別的問題。 – 2011-12-14 19:49:56

相關問題