lockステートメントを挿入します

常にテーブルにはロックを挿入していないと思ったが、それはそうではありません前に、ここではいくつかの例と証拠があります。

CREATE  TABLEを [ DBO ][ TEST1 ] [ C1 ]  [ VARCHAR ]100NULL [ C2 ]  [ VARCHAR ]100NULL [ C3 ]  [ VARCHAR ]100NULLは

セット NOCOUNT 
宣言 @a  INT = 1が
開始 TRANを
しばらく @a <= 100000 
開始
    挿入 TEST1
     セレクト 変化()、変更()、変化()
     セット @a = @a + 1 
端を

 

1セッションウィンドウで次の手順を実行します。

BEGIN  TRANが
インサート TEST1
 選択 ' 1 '' 2 '' 3 '

 

2セッションウィンドウで次の手順を実行します。

SELECT   *  FROM TEST1   C1は= ' D638C '

 

あなたは、命令セッション2は、具体的なロックケースを見るために待っているでしょう

SELECT request_owner_id、
    RESOURCE_TYPE、
    request_mode、
    resource_description、
    request_session_id、
    request_status、
    resource_associated_entity_id、
    DB_NAME(resource_database_id)としてresource_database
 FROM 
    sys.dm_tran_locks 

    RESOURCE_TYPE <> ' DATABASE ' AND DB_NAME(resource_database_id)= ' CustomDB ' ORDER BY request_owner_id。   
 

 

注意:request_owner_id:あなたは2つのウィンドウが開き、2があるrequest_owner_id

上記のように、1:待機セッション1つの結論に送信されたクエリ:プラス上の行の挿入ステートメントが、2いることを示している主キーが存在しないテーブルでは、テーブル全体をロックするつながる文を挿入し、テーブル全体を照会することができません。

主キーの以下の議論:

CREATE  TABLEを [ DBO ][ TEST2 ] [ C1 ]  [ VARCHAR ]100ではない NULL [ C2 ]  [ VARCHAR ]100NULL [ C3 ]  [ VARCHAR ]100NULLは

セット NOCOUNTを
DECLARE  @a  INT = 1 
始める TRANを
ながら @a <= 100000 
開始
    挿入  [ TEST2 ] 
    選択 @a変化()、変化が()
     セット @a = @a + 1 
端が

変更 テーブルを [ TEST2 ]  追加 制約 TTT プライマリ cyfnodを(C1)

 

セッション1:

BEGIN  TRANが
インサート  [ TEST2 ] 
を選択 ' 00101 '' 2 '' 3 ' 
-         TRANをCOMMIT

 

セッション2:

SELECT   *  FROM TEST2   C1 = ' 00101 '

 

セッション3:

SELECT   *  FROM TEST2   C1 = ' 1 '

 

 

セッション4:

SELECT   *  FROM TEST2   C2 = ' 6900B68A-F4ED - 4B44-875A-365C80F8D28A '

 

あなたは2,4がブロックされたセッションを見つけるだろうが、セッション3が実行可能である、という結論:表に主キーを持っている、とあなたは主キーのクエリを使用する場合、唯一の主キーの値をロック挿入します。

おすすめ

転載: www.cnblogs.com/ziqiumeng/p/10936609.html
おすすめ