2

MS SQL Server 2008 でトランザクションを開始し、テーブル レコードを更新すると、トランザクションをコミットしない限り、SQL サーバーは他のユーザーがそのレコードを読み取れないようにロックします (Isolation level = Read Committed の場合)。

トランザクション中およびコミットする前に、他のユーザーが元の値を読み取れないようにするにはどうすればよいですか (ReadCommitted の場合)。

例: 個人テーブルでトランザクションを開始し、個人名を「Alex1」から「Alex2」に更新すると、Readcommitted 分離レベルの場合、トランザクションをコミットしない限り、他のユーザーはレコードを読み取ることができません! それで、トランザクション中に他のユーザーが元の値「Alex1」を読み取れないようにするにはどうすればよいですか(コミットされていない値を読み取らせたくありません)。コミットすると、コミットされた値である「Alex2」を読み取ることができます"?

ありがとう、

4

2 に答える 2

1

についてのまさにソースからの引用READ COMMITTED TRANSACTION ISOLATION LEVEL

ステートメントは、他のトランザクションによって変更されたがコミットされていないデータを読み取ることができないことを指定します。これにより、ダーティ リードが防止されます。データは、現在のトランザクション内の個々のステートメント間で他のトランザクションによって変更される可能性があり、その結果、反復不可能な読み取りまたはファントム データが発生します。このオプションは、SQL Server のデフォルトです。

READ COMMITTED の動作は、READ_COMMITTED_SNAPSHOT データベース オプションの設定によって異なります。

READ_COMMITTED_SNAPSHOT が OFF (既定) に設定されている場合、データベース エンジンは共有ロックを使用して、現在のトランザクションが読み取り操作を実行している間、他のトランザクションが行を変更できないようにします。共有ロックは、他のトランザクションが完了するまで、ステートメントが他のトランザクションによって変更された行を読み取ることもブロックします。共有ロックのタイプによって、いつ解放されるかが決まります。行ロックは、次の行が処理される前に解放されます。次のページが読み取られるとページ ロックが解放され、ステートメントが終了するとテーブル ロックが解放されます。

私の解釈では、 を に設定すればREAD COMMITTED、トランザクションがコミットされる前に でデータを読み取ることができることを意味します。shared lock typerow lock

于 2014-03-08T23:55:47.690 に答える