• Insert语句的锁


    之前一直以为Insert不会对表产生锁,而事实并非如此吧,下面给出一些实例和证明。

    CREATE TABLE [dbo].[TEST1](
        [C1] [varchar](100) NULL,
        [C2] [varchar](100) NULL,
        [C3] [varchar](100) NULL
    )
    
    set nocount on
    declare @a int=1
    begin tran
    while @a<=100000
    begin
        insert into TEST1
        select newid(),newid(),newid()
        set @a=@a+1
    end

    在会话1窗口中执行如下指令:

    BEGIN TRAN
    insert into TEST1
    select '1','2','3'

    在会话2窗口中执行如下指令:

    SELECT  * FROM TEST1  where 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)as resource_database
    FROM
        sys.dm_tran_locks
    WHERE
        resource_type <> 'DATABASE' AND DB_NAME(resource_database_id)='CustomDB'
    ORDER BY request_owner_id;

    注: request_owner_id :你开了2个窗口,request_owner_id 就有2个

    如上图,1:表示这个insert语句在某一行上面加了,2:查询语句在等待会话1提交,结论:在没有主键的表里面,insert语句会导致锁住整个表,整个表都不能查询。

    下面讨论有主键的情况:

    CREATE TABLE [dbo].[TEST2](
        [C1] [varchar](100)not NULL,
        [C2] [varchar](100) NULL,
        [C3] [varchar](100) NULL
    )
    
    set nocount on
    declare @a int=1
    begin tran
    while @a<=100000
    begin
        insert into [TEST2]
        select @a,newid(),newid()
        set @a=@a+1
    end
    
    alter table [TEST2] add constraint TTT primary key(C1 )

    会话1:

    BEGIN TRAN
    insert into [TEST2]
    select '00101','2','3'
    --        COMMIT TRAN

    会话2:

    SELECT  * FROM TEST2  where C1 ='00101'

    会话3:

    SELECT  * FROM TEST2  where C1 ='1'

    会话4:

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

    你会发现会话2、4被阻塞了,但是会话3能够执行,结论:在有主键的表里,并且你用主键查询的时候,insert只会锁住主键值。

  • 相关阅读:
    zabbix 设备(自己的实践)
    10.24的注意事项——解决linux_jni编译错误的问题
    [Angular] Adding keyboard events to our control value accessor component
    [tmux] Copy and paste text from a tmux session
    [tmux] Customize tmux with tmux.conf
    [tmux] Zoom and resize to view a particular pane within tmux
    [tmux] Manage terminal workspaces using session naming
    [tmux] Reuse terminal workspaces using tmux sessions
    [tmux] Create collections of panes using tmux windows
    [tmux] Organize your terminal using tmux panes
  • 原文地址:https://www.cnblogs.com/ziqiumeng/p/10936609.html
Copyright © 2020-2023  润新知