データベースのデフォルトの分離レベルは「read commit snapshot」です。以下のスクリーンショットをご覧ください。
データベースに次のデータを含むテーブル「チケット」があります。
現在、接続1で、分離レベルが「read commit」として新しいトランザクションを開始しています。そして、#TicketID "2"の優先度を「medium」に更新します。
接続2から、#TicketID "2"の詳細にアクセスしようとしています。また、コミットされた読み取りスナップショット分離によって作成されたバージョンストアからの値を取得しますが、これは予期された動作ではありません。
ドキュメントによると、「read commit」分離レベルを使用するトランザクションの場合、トランザクションがcommit/Rollbackを実行するまで、他のトランザクションは行にアクセスできません。
特定のシナリオでそれが発生しない理由を誰かに教えてもらえますか?また、データベースレベルで設定されているデフォルトの分離レベル(ここではコミットされた読み取りスナップショット)をトランザクションレベルの分離で上書きできないのはなぜですか。
トランザクションスコープの分離オーバーライドをより明確にするために、以下の情報を提供します。
データベース分離を読み取りコミットに設定しました。
ここで接続1で、トランザクションを開始してチケットの優先度を更新します。
接続2では、レコードにアクセスしようとしています。ただし、トランザクション分離レベルが「コミット読み取り」モードであるため、これは完了しません。
接続3では、分離レベルが「コミットされていない読み取り」としてレコードにアクセスしようとしています。ここでは、データベースレベルで設定されているデフォルトの分離を上書きするため、レコードを表示できます。
"Snapshot Isolation"をデータベースレベルで設定し、別のトランザクションスコープでオーバーライドすると、同じ動作が期待されます。私にとっては、トランザクションスコープで言及されている分離レベルに関係なく、常にバージョンストアから最後にコミットされた値を返します。私は私の懸念を明確に伝えてくれれば幸いです。
トランザクション全体のコミット読み取りスナップショット(RCSI)のデータベースレベルの設定を上書きする方法はありません。
RCSIが設定されている場合、コミットされたすべての読み取りトランザクションは行バージョンを使用し、行の最後にコミットされたバージョンを提供します。
セッションレベルのオーバーライドオプションが要求されました。 Add SET TRANSACTION ISOLATION LEVEL READ COMMITTED LOCK
の製品フィードバックサイトで投票できます。
per-statementおよびper-tableの設定は、 READCOMMITTEDLOCK
テーブルヒント。
または、スナップショット分離(SI)を使用して、読み取りコミットスナップショット分離(RCSI)をオフにすることもできます。その後、各トランザクションはSET TRANSACTION ISOLATION SNAPSHOT
またはSET TRANSACTION ISOLATION LEVEL READ COMMITTED
になります。
分離レベルの詳細については 一連の記事 を参照してください。
READ COMMITTEDis分離レベルです。次に、データベースレベルでノブを使用して、この分離レベルの実装方法を決定できます。ブロッキング動作が必要な場合は、それに応じてデータベースを構成します(データベースの読み取りコミットスナップショットをオフに設定します)。
より高い粒度でこの分離レベルに別のものが必要な場合は、クエリレベルでqoし、ここで説明されているREADCOMMITTEDLOCKテーブルヒントを使用する必要があります。 https://docs.Microsoft.com/en-us/ sql/t-sql/queries/hints-transact-sql-table?view = sql-server-2017 。
そしてもちろん、いくつかの異なる分離レベルを選択することもできます。この場合、コミットされた読み取りスナップショットのデータベース設定には違いがありません。