0

BeginTransactionここにあるドキュメントに注意事項があることに気付きました。

http://msdn.microsoft.com/en-us/library/86773566.aspx

クエリが大量のデータを返し、BeginTransaction を呼び出すと、SQL Server が MARS を使用しているときに並列トランザクションを許可しないため、SqlException がスローされます。この問題を回避するには、リーダーを開く前に、常にトランザクションをコマンド、接続、またはその両方に関連付けます。

私がこれを変更するというこの提案はありますか:

sqlConn.Open();

System.Data.SqlClient.SqlTransaction trans = sqlConn.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted); 
sqlCmd.Transaction = trans;

System.Data.SqlClient.SqlDataAdapter adapt = new System.Data.SqlClient.SqlDataAdapter(sqlCmd);
adapt.Fill(dt);

これには、BeginTransactionコマンドの前にOpenコマンドを使用して、例で通常見られるものではありません...

System.Data.SqlClient.SqlTransaction trans = sqlConn.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted); 
sqlCmd.Transaction = trans;

sqlConn.Open();

System.Data.SqlClient.SqlDataAdapter adapt = new System.Data.SqlClient.SqlDataAdapter(sqlCmd);
adapt.Fill(dt);

そうでなければ、この警告が避けるように言っていることの例を誰か挙げることができますか?

4

1 に答える 1

1

接続を開く前にトランザクションを開始できないため、後者のコードは実行されません。最初の例は正しいです。ここで MSDN が言っていることは、コマンドの実行を開始すると (そして結果の読み取りが終了しないと)、トランザクションを開くことができないということです。最初のコマンドの前 (またはコマンドの間) にトランザクションを開く必要があります。

ADO.NET 接続プーリングには、プールされた接続間で分離レベルをリークするバグ/機能があるため、常に明示的なトランザクションの下で操作することをお勧めします。

于 2013-07-19T16:52:45.990 に答える