sql >> データベース >  >> RDS >> Database

MSSQLのトランザクション分離レベルに応じた読み取り/書き込みロックのヒント

    コミットされていないものを読む

    • 1つのトランザクションでデータが変更されている場合、このデータの選択(他のトランザクションまたはトランザクションなし)は、最初のトランザクションが終了するまで待機せず、コミットされていないトランザクションのデータエントリを返します。
    • 1つのトランザクションでデータが読み取られている場合、他のトランザクションでのこのデータの更新は、最初のトランザクションが終了するまで待機しません。
    • 共有ロックは使用されません。 設定と同じ t NOLOCK ヒント ReadCommittedのすべての選択。
    • 排他的ロックは、ステートメントの実行中に有効になり、最後に無効になります f トランザクション

    コミット済みの読み取り+read_committed_snapshotoff
    (alter database xxx set read_committed_snapshot off)

    • 1つのトランザクションでデータが変更されている場合、このデータの選択(他のトランザクションまたはトランザクションなし)は、最初のトランザクションが終了するまで待機します。 セレ ct with NOCHECK ヒント 変更されたがコミットされていないデータを返します。
    • 1つのトランザクションでデータが読み取られている場合、他のトランザクションでのこのデータの更新は、最初のトランザクションが終了するまで待機しません。
    • 共有ロックは、ステートメントの実行中に有効になり、状態の終了時に無効になります 実行しない
    • 排他的ロックは、ステートメントの実行中に有効になり、トランザクションの終了時に無効になります

    Read Committed + read_committed_snapshot on
    (alter database xxx set read_committed_snapshot on)

    • 1つのトランザクションでデータが変更されている場合、このデータの選択(他のトランザクションまたはトランザクションなし)は、最初のトランザクションが終了するまで待機せず、瞬間に値を返します t of トランザクション開始選択 NOCHECKヒント は、変更されたがコミットされていないデータを返します。
    • 1つのトランザクションでデータが読み取られている場合、他のトランザクションでのこのデータの更新は、最初のトランザクションが終了するまで待機しません。
    • 共有ロックは使用されません。代わりに行バージョン管理メカニズムが使用されます–更新されたレコードのデータは tempdbに保存されます 。
    • 排他的ロックはステートメントの実行中に有効になり、トランザクションの終了時に無効になります

    繰り返し読み取り

    • 1つのトランザクションでデータが変更されている場合、このデータの選択(他のトランザクションまたはトランザクションなし)は、最初のトランザクションが終了するまで待機します。選択 NOLOCKヒントは、変更されたがコミットされていないデータを返します。
    • 1つのトランザクションでデータが読み取られている場合、他のトランザクションでのこのデータの更新は、最初のトランザクションが終了するまで待機します。
    • 共有ロックは、ステートメントの実行中に有効になり、トランザクションの終了時に無効になります 、ReadCommittedとは異なります。
    • 排他的ロックは、ステートメントの実行中に有効になり、トランザクションの終了時に無効になります

    シリアル化可能

    • 1つのトランザクションでデータが変更されている場合、このデータの選択(他のトランザクションまたはトランザクションなし)は、最初のトランザクションが終了するまで待機します。 選択 NOLOCKヒントは 変更されたがコミットされていないデータを返します。
    • 1つのトランザクションでデータが読み取られている場合、他のトランザクションでのこのデータの更新は、最初のトランザクションが終了するまで待機します。
    • 共有ロックは、ステートメントの実行中に有効になり、トランザクションの終了時に無効になります
    • 排他的ロックはステートメントの実行中に有効になり、トランザクションの終了時に無効になります。
    • クエリ条件の範囲を満たすキーに対して、排他的範囲ロックが有効になっています。この範囲内の新しいレコードの挿入は許可されていません。設定と同じ HOLDLO CK ヒント のすべてのSELECT Committedをお読みください。

    スナップショット
    (alter database xxx set allow_snapshot_isolation on)

    • 1つのトランザクションでデータが変更されている場合、このデータの選択(他のトランザクションまたはトランザクションなし)は、最初のトランザクションが終了するまで待機しません。 現時点で値を返します の トランザクション開始選択 NOLOCKヒントは 変更されたがコミットされていないデータを返します。
    • 1つのトランザクションでデータが読み取られている場合、他のトランザクションでのこのデータの更新は、最初のトランザクションが終了するまで待機しません。
    • 共有ロックは使用されません。代わりに行バージョン管理メカニズムが使用されます–更新されたレコードのデータは tempdbに保存されます 。
    • 排他的ロックは、ステートメントの実行中に有効になり、トランザクションの終了時に無効になります。

    MSSQL2014でテスト済み。


    1. 16進数をvarchar(datetime)にキャストする方法は?

    2. データベースメールアカウント(SSMS)を作成する

    3. PostgreSQLでパターンを照合しながら文字列をエスケープする方法

    4. 特定のテーブルを使用するすべてのクエリを検索する