@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

ダーティ読み取りのできるトランザクションについて

1
投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2004/08/26
投稿数: 34
投稿日時: 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();
}
}
}
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-02-25 16:38
流し読みしかしてないけど、ダーティリードする側の接続(Con2?)で、READ UNCOMMITTED 分離レベルを指定しないと意味ないんじゃないの?
未記入
常連さん
会議室デビュー日: 2004/08/26
投稿数: 34
投稿日時: 2005-02-25 16:54
すばやい返答&流し読みありがとうございます。

>流し読みしかしてないけど、ダーティリードする側の接続(Con2?)で、READ >UNCOMMITTED 分離レベルを指定しないと意味ないんじゃないの?

※Aのすぐ後に
cmd2.Transaction = Con2.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted);

と記述したところ、ダーティリードできました。
ありがとうございました。

1

スキルアップ/キャリアアップ(JOB@IT)