zoukankan      html  css  js  c++  java
  • SQL Server 2008 R2 的一个死锁问题

    SQL Server 2008 R2 太容易出现死锁了,无语了。

    做了个简单例子测试一下:

    1.建一个测试表:

    CREATE TABLE [dbo].[LockTest](
        [ID] [int] NULL,
        [Name] [nvarchar](10NULL
    ON [PRIMARY]

    GO

    随便插入2条记录,然后,打开SSMS,新建2个查询,同时执行下面的代码,模拟2个并发线程更新同一张表,不同记录的情况:

    set transaction isolation level serializable 
    declare @count int 
    declare @tranname varchar(10)
    set @count =1
    while(@count <10)
    begin 
    set @tranname='B'+convert(varchar,@count)
    begin tran @tranname
        update dbo.LockTest set Name ='BBBB' where ID =2;
        waitfor delay '00:00:02'
    commit tran @tranname
     set @count =@count +1    
    end 
     
    set transaction isolation level serializable 
    declare @count int 
    declare @tranname varchar(10)
    set @count =1
    while(@count <10)
    begin 
    set @tranname='A'+convert(varchar,@count)
    begin tran @tranname
        update dbo.LockTest set Name ='aaa' where ID =1
        waitfor delay '00:00:02'
    commit tran @tranname
     set @count =@count +1    
    end 

    按道理,这不应该造成死锁,顶多互相阻塞一下而已,但事实上,确引发了死锁。

    (1 行受影响)
    commit tran :A1
    begin tran :A2
    消息 1205,级别 13,状态 18,第 10 行
    事务(进程 ID 56)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。

    查看后台日志,发现如下:

    说明,2个进程都申请到了IX锁,然后其中一个要将IX转成X锁,转换失败,造成死锁。

    我的疑问是,难道SQL Server ,这样的并发也会死锁吗?

  • 相关阅读:
    多个ROS工作空间常见的问题
    ROS tf(现在都使用tf2了)
    ERROR: cannot launch node of type [teleop/teleop_key]: can't locate node [teleop_key] in package [teleop]
    Linux上静态库和动态库的编译和使用
    【C++】类中this指针的理解
    fatal error: No such file or directory
    g2o使用教程
    如何理解二次型
    <ROS> message_filters 对齐多种传感器数据的时间戳
    linux与C内存管理机制
  • 原文地址:https://www.cnblogs.com/yhnxuhbgx/p/2524577.html
Copyright © 2011-2022 走看看