2011-12-14 4 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

は、なぜあなたは、読み取り専用操作上のトランザクションが必要なのでしょうか? –

答えて

2

ニティンMidhaが述べたように、「今までに単一の読み取りステートメントの周りにトランザクション性を置くする必要がある」されて、あなただけのデータを読み取るか、たとえ時にトランザクションを使用する必要はありませんあなたのコードはデータを更新しますが、データベースへのアクセスは1つしかありません(つまり、挿入、更新、削除を行うSPを呼び出す)。 トランザクションはできるだけアトミックであるべきだと言われているので、最初のデータベースの更新アクセスの直前と直近の直後に作成する必要があります。 try catchブロック内にある場合は、tryの前にトランザクション変数を定義し、必要なときtryを呼び出し、catchセクションでtransaction =!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')。私は、より高いレベルの問題としてトランスアクチンを作り出すことに失敗していると考えています。 –

+0

@pst答えとしてあなたの例を投稿すると、私は怒らないでしょう、私たちはすべてここに学びます! –

関連する問題