4

「すべてのステートメント(選択/挿入/削除/更新)には、トランザクションに関係なく分離レベルがあります」というのは本当ですか?

トランザクション内でステートメントの更新を設定したシナリオがあります(ReadCommitted)。そして、トランザクションにない別のセット(selectステートメント)。

  1. この場合、最初のセットが実行されているとき、別の待機があります。
  2. DBにREAD_COMMITTED_SNAPSHOTを設定すると、デッドロックが発生します。

    ALTER DATABASE Amelio SET ALLOW_SNAPSHOT_ISOLATION ON
    ALTER DATABASE Amelio SET READ_COMMITTED_SNAPSHOT ON
    

この問題を解決するには、TransactionScopeに「Select」ステートメントを配置する必要がありますか?

4

1 に答える 1

2

SQL Serverでは、すべてのトランザクションに暗黙的または明示的なトランザクションレベルがあります。で呼び出された場合は明示BEGIN/COMMIT/ROLLBACK TRANSACTION的、このようなものが発行されない場合は暗黙的。

更新クエリを開始する前にスナップショットを開始します。それ以外の場合は、SQL Serverに変更された行をtempdbに準備する機会を与えず、Updateクエリはロックを開いたままにします。

スナップショットアイソレーションを作成しない別SELECT <columns> FROM <table> WITH (NOLOCK)の方法は、SQL Serverに何があっても行を取得するように指示する方法(別名READ_UNCOMMITED)を使用することです。クエリヒントであるため、設定を行っても分離レベルが変更されます。行のどの状態が照会されるかを気にしない場合は機能しますが、受信したデータを評価するときは注意が必要です。

于 2010-02-05T10:55:41.127 に答える