常にテーブルにはロックを挿入していないと思ったが、それはそうではありません前に、ここではいくつかの例と証拠があります。
CREATE TABLEを [ DBO ]。[ TEST1 ] ( [ C1 ] [ VARCHAR ](100)NULL 、 [ C2 ] [ VARCHAR ](100)NULL 、 [ C3 ] [ VARCHAR ](100)NULLは ) セット 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 ](100)NULL 、 [ C3 ] [ VARCHAR ](100)NULLは ) セット 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が実行可能である、という結論:表に主キーを持っている、とあなたは主キーのクエリを使用する場合、唯一の主キーの値をロック挿入します。