私のデータベースにアクセスするには、以下のコード(簡略化されたコード)があります。私は文とパラメータの使用について知っていますが、私はこれを短くして問題に集中します。第二部でSQLトランザクション内のデッドロックの回避
string ConnectionString = "ConnectionStringHere";
//1. insert Transaction
SqlConnection myConnection = new SqlConnection(ConnectionString);
SqlTransaction myTrans = myConnection.BeginTransaction();
string sUpdate = "INSERT INTO User (FirstName, LastName) VALUES ('jon','doe')";
SqlCommand myCommand = new SqlCommand(sUpdate, myConnection, myTrans);
myCommand.ExecuteNonQuery();
//2. select from the same table
SqlConnection myConnection2 = new SqlConnection(ConnectionString);
string sSelect = "SELECT FirstName, LastName FROM User WHERE ID = 123";
DataTable dtResult = new DataTable();
SqlDataAdapter myDataAdapter2 = new SqlDataAdapter(sSelect, myConnection2);
myDataAdapter2.Fill(dtResult); //TimeOut Exception here
//submit changes from my transaction here
myTrans.Commit();
私はそのあとで私のトランザクションmyTrans.Commit();
をコミットするまで、私は私のUser
テーブルにアクセスすることはできませんので、私はTimeOutExcetionを取得する - デッドロック。
私の質問はここです - ここではデッドロックを避けるためのベストプラクティスは何ですか?私は、トランザクションのSELECT
一部を行うことにより、またはIsolationLevel
SqlTransaction myTrans = myConnection.BeginTransaction(IsolationLevel.ReadUncommitted);
を設定することにより、例外を避けることができしかし、私はそれらの使用法についてはよく分かりません。私は常にIDで選択するので、無効なデータについて心配する必要はありません。
あなたは現在接続を開いていませんが、実際のコードですか? –
@Tim、実際のコードはありません – fubo
別の接続を使用しているために、現在の問題が発生します。それはあなたの必要条件ですか? – Arvo