7

SQL Server 2008 R2 の SNAPSHOt 分離レベルについては、MSDN ADO.Net ドキュメントに次のように記載されています。

データを変更するトランザクションは、データを読み取るトランザクションをブロックしません。また、データを読み取るトランザクションは、SQL Server の既定の READ COMMITTED 分離レベルで通常行われるように、データを書き込むトランザクションをブロックしません。

両方のトランザクションが SNAPSHOT 分離モードの場合、書き込みが書き込みをブロックするかどうかについては言及されていません。したがって、私の質問は次のとおり です。SNAPSHOT トランザクション 1 ブロックの書き込みは、別の SNAPHOT トランザクション 2 の同じテーブルに書き込みますか?

最新のアップデート

私の質問について多くのことを考えた後、以下の段落に記載されている結論に達しています。他の人がこれにもっと光を当てることができることを願っています。

書き込みが書き込みをブロックしないリレーショナル データベースはありません。つまり、書き込みは常に書き込みをブロックします。書き込みには、INSERT、UPDATE、DELETE などのステートメントが含まれます。これは、使用する分離レベルに関係なく当てはまります。データベースで複数の書き込みが発生している場合、すべてのリレーショナル データベースはデータの一貫性を実装する必要があるためです。もちろん、このブロッキングが発生するには、同時書き込みが競合している必要があります (同じテーブルへの挿入または同じ行の更新など)。

4

2 に答える 2

3

いいえ、ブロックしません。代わりに、UPDATEコマンドはtrans2エラー番号 3960 で失敗します。

SNAPSHOT分離レベルの仕組みが原因で、UPDATEコマンドが失敗する可能性があります。唯一の方法は、エラー 3960 をキャッチして処理することです (この状況が頻繁に発生することは想定されていないため、オプティミスティック コンカレンシーと呼ばれます)。

ドキュメントから完全に明らかではないため、これを経験的にテストすることになりました。ただし、このブログ投稿はそれをうまく示しています。


仮定:trans1との両方trans2が同じテーブルの同じ行を更新しています。2 つの異なる行を更新しても問題なく動作するはずです。

于 2012-10-02T04:44:40.807 に答える