zoukankan      html  css  js  c++  java
  • 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只会锁住主键值。

  • 相关阅读:
    luogu P3168 [CQOI2015]任务查询系统
    luogu P2633 Count on a tree
    c++小游戏:洛谷彩票
    UVA514 铁轨 Rails:题解
    SP1805 HISTOGRA
    洛谷 P4363 [九省联考2018]一双木棋chess 题解
    比赛:大奔的方案solution
    【CYH-02】NOIp考砸后虐题赛:数学:题解
    【CYH-02】NOIp考砸后虐题赛:坐标:题解
    【CYH-02】NOIp考砸后虐题赛:转换式:题解
  • 原文地址:https://www.cnblogs.com/ziqiumeng/p/10936609.html
Copyright © 2011-2022 走看看