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

SQL Server、誤解を招くXLOCKと最適化

    Xの独占性 ロックとU ロック

    以下のロック互換性マトリックスでは、X ロックは、スキーマの安定性および挿入範囲-ヌルロックタイプとのみ互換性があります。 U 次の追加の共有ロックタイプSと互換性があります / IS / RS-S / RI-S / RX-S

    ロック互換性マトリックスhttp://i.msdn.microsoft.com/ms186396.LockConflictTable(en-us,SQL.105).gif

    Xの粒度 ロック

    これらはすべてのレベルでうまく取り出されます。以下のスクリプトとプロファイラーのトレースは、行レベルで正常に取り出されていることを示しています。

    CREATE TABLE test_table (id int identity(1,1) primary key, col char(40))
    
    INSERT INTO test_table
    SELECT NEWID() FROM sys.objects
    
    select * from test_table with (rowlock,XLOCK) where id=10
    

    ただし、行は引き続き読み取ることができます!

    read committedで 分離レベルのSQLServerは、常にSを取得するとは限りません。 ロックの場合、ロックなしでコミットされていないデータを読み取るリスクがない場合は、この手順をスキップします。これは、ロックの競合が発生する保証がないことを意味します。

    ただし、最初の選択がwith (paglock,XLOCK)の場合 次に、これは Xとして読み取りトランザクションを停止します ページをロックすると、ISがブロックされます リーダーが常に必要とするページロック。もちろん、これは同時実行性に影響を与えます。

    その他の警告

    行/ページをロックしても、これはテーブル内のその行へのすべてのアクセスをブロックすることを意味するわけではありません。クラスター化インデックスの行をロックしても、対象となる非クラスター化インデックスの対応する行からデータを読み取るクエリが妨げられることはありません。



    1. 継続的なデータベース監視の改善のための秘訣

    2. Postgresの行サイズを理解する

    3. MariaDB FOUND_ROWS()の説明

    4. AzureSQLデータベースに移行するメリットのトップ5