- - PR -
ダーティ読み取りのできるトランザクションについて
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-02-25 16:09
こんにちは。
トランザクション処理で悩んでいます。 一連のトランザクション処理の中で、INSERTしたデータをSELECTする場合、 トランザクションロックがかかり、タイムアウトエラーになってしまいます。 ※@の引数をSystem.Data.IsolationLevel.ReadUncommittedにしてもタイムアウトに なってしまいます。 ※AのSQL文に(nolock)を加えると、正常に処理が終了するのですが、他に方法は ないもんかなと検討しています。 処理※Aと処理※Bで、コネクションが別になっているのですが 同じコネクションにした場合、 仮に処理※Bのループの中で更新処理を行いたくてもビジー状態になってしまいます。 よい方法がございましたらご教授よろしくお願いします。 //以下、コード------------------------------------------------------- const string strCon = "接続文字列"; [STAThread] static void Main(string[] args) { Test(); } private static void Test() { SqlConnection Con; SqlTransaction tx = null; using(Con = new SqlConnection(strCon)) { try { Con.Open(); tx = Con.BeginTransaction(); //※@ //TEST1_TBLにデータ追加 ※A SqlCommand cmd1 = new SqlCommand("INSERT INTO TEST1_TBL(F1, F2) VALUES(1,2)", Con); cmd1.Transaction = tx; int recordAffected = cmd1.ExecuteNonQuery(); //TEST1_TBLを読み込み ※B SqlConnection Con2 = new SqlConnection(strCon); Con2.Open(); SqlCommand cmd2 = new SqlCommand("SELECT * FROM TEST1_TBL", Con2); //※A SqlDataReader dr = cmd2.ExecuteReader(); while(dr.Read()) { System.Diagnostics.Debug.WriteLine("F1:" +dr["F1"].ToString() + " F2:" + dr["F2"].ToString()); } dr.Close(); Con2.Close(); tx.Commit(); } catch(Exception e) { System.Diagnostics.Debug.WriteLine(e.Message); tx.Rollback(); } finally { Con.Close(); } } } |
|
投稿日時: 2005-02-25 16:38
流し読みしかしてないけど、ダーティリードする側の接続(Con2?)で、READ UNCOMMITTED 分離レベルを指定しないと意味ないんじゃないの?
|
|
投稿日時: 2005-02-25 16:54
すばやい返答&流し読みありがとうございます。
>流し読みしかしてないけど、ダーティリードする側の接続(Con2?)で、READ >UNCOMMITTED 分離レベルを指定しないと意味ないんじゃないの? ※Aのすぐ後に cmd2.Transaction = Con2.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted); と記述したところ、ダーティリードできました。 ありがとうございました。 |
1