存在这样情况:
1.表TB1有一列建立索引
2.事务A对表进行更新,先获取对表的X锁以更新基本表中数据,然后对索引申请X锁以更新索引数据。
3.事务B对表进行更新,先获取索引上S锁以使用索引进行Loopup来查询数据,然后申请表的X锁以更新基本表数据

由于事务A和事务B申请到一部分锁资源同时需要对方的锁资源来完成操作,由于锁的不可剥夺性导致死锁产生

--使用DBCC 来打开追踪死锁
DBCC TRACEON(1222,-1) --创建测试表
CREATE TABLE TB0001
(
C1 INT NOT NULL,
C2 INT NOT NULL,
C3 INT NOT NULL
)
--向测试表中填充数据,执行多次将表中数据填充上1W
INSERT INTO TB0001(C1,C2,C3)
SELECT C.object_id,C.column_id,C.column_id FROM sys.all_columns C --在测试表上建立索引
CREATE INDEX IX_C2 ON TB0001
(
C2 DESC
) ---打开一连接执行以模拟事务A操作
WHILE(1=1)
BEGIN
UPDATE dbo.TB0001
SET C2=C2+1
END ---打开一连接执行以模拟事务B操作
--查询中强制使用索引,以模拟RID lookup
WHILE(1=1)
BEGIN
UPDATE dbo.TB0001
SET C1=C1+2
WHERE C2 IN
(
SELECT C2 FROM TB0001 WITH(INDEX=IX_C2 )
WHERE C3=5
)
END

等到死锁发生:
Msg 1205, Level 13, State 45, Line 3
Transaction (Process ID 65) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

查看SQL Server日志


解决此类死锁的有效办法:
1.减少每次修改数据的行数,以减少事务的执行时间,从而降低事务发生的可能性
2.在一些情况下使用Include索引来减少lookup操作

Transaction And Lock--由Lookup导致的死锁情况的更多相关文章

  1. Transaction And Lock--由外键导致的死锁

    死锁发生情况:1. 存在表A和表B,表A的主键是表B的外键2.事务A在表A上申请到X锁以修改表A中数据和删除表A中的数据,然后需要检查表B中的数据是否满足外键约束,从而需要Range锁来锁住表B3.事 ...

  2. Transaction And Lock--唯一索引下INSERT导致的死锁

    背景: 曾经的一位同事问我:"数据库只有并发INSERT 操作,会造成死锁么?",我没有太多思考地回答"不会",但真的不会吗? 测试: --========== ...

  3. 记一次 oracle 12.2 RAC : Transaction recovery: lock conflict caught and ignored

    节点一 alert日志: PDB(17):Transaction recovery: lock conflict caught and ignored PDB(17):Transaction reco ...

  4. MySQL 5.6.35 索引优化导致的死锁案例解析

    一.背景 随着公司业务的发展,商品库存从商品中心独立出来成为一个独立的系统,承接主站商品库存校验.订单库存扣减.售后库存释放等业务.在上线之前我们对于核心接口进行了压测,压测过程中出现了 MySQL ...

  5. 分析SIX锁和锁分区导致的死锁

    什么是SIX锁? 官方文档锁模式中说到: 意向排他共享 (SIX):保护针对层次结构中某些(而并非所有)低层资源请求或获取的共享锁以及针对某些(而并非所有)低层资源请求或获取的意向排他锁. 顶级资源允 ...

  6. Transaction recovery: lock conflict caught and ignored

    Transaction recovery: lock conflict caught and ignored环境:RAC 4节点.oracle 11.2.0.4.redhat 5.9 64bit 问题 ...

  7. JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

    JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...

  8. Python:关于subprocess.stdout.read()导致程序死锁的问题

    subprocess.stdout.read()导致程序死锁的问题解决 今天有位老哥联系我说,在我的python之路系列中,解决粘包问题那一章的代码有BUG 这里当运行命令过于庞大的时候,会导致程序直 ...

  9. SET Transaction Isolation Level Read语法的四种情况

    转自:http://www.cnblogs.com/qanholas/archive/2012/01/04/2312152.html 存储过程:SET Transaction Isolation Le ...

随机推荐

  1. easyui隐藏列

    1.$("#test-datagrid").datagrid('hideColumn', 'password');其中第二个参数为对应的域,即field 2. <th dat ...

  2. Struts2结果页面配置(Result)

    1.全局页面配置 全局结果页面:针对一个包下的所有Action的页面跳转都可生效 <global-results> <result name="xxx">/ ...

  3. C#路径的相关操作

    1.判定一个给定的C#路径是否有效,合法 通过Path.GetInvalidPathChars或Path.GetInvalidFileNameChars方法获得非法的C#路径/文件名字符,可以根据它来 ...

  4. onload函数和自执行函数的区别(jquery API网址:http://jquery.cuishifeng.cn/)

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. std::mutex 引起的 C2280 尝试引用已删除的函数

    起因是把之前写的类中的 mutex 使用了(之前注释掉了没用到这个变量); 或者说添加了一个 mutex 变量, 然后 这个类有嵌套在了 其类的 map 中使用, 然后 编译 就报错 ` C2280 ...

  6. 字符图元 & 显示列表

    [字符图元] 1.typeface(字样),即设计风格,如Courier等. 2.font(字体),如10磅Courier斜体. 3.monspace即为等宽字体,proportional为非等宽字体 ...

  7. 【LA2531 训练指南】足球联赛 【最大流】

    题意: 有n支队伍进行比赛,每支队伍需要打的比赛数目相同.每场比赛恰好一支队伍胜,另一支败.给出每支队伍目前胜的场数和败的场数,以及每两支队伍还剩下的比赛场数,确定所有可能的冠军的球队.(获胜场数最多 ...

  8. 使用Jenkins集成和自动化打包资料

    1.手把手教你利用Jenkins持续集成iOS项目 http://www.jianshu.com/p/41ecb06ae95f 2.Jenkins+ Xcode+ 蒲公英 实现IOS自动化打包和分发 ...

  9. Servlet小案例总结

    亮点: 没有使用任何框架,视图层和业务层使用Servlet技术进行交互,持久层用java的jdbc工具类进行数据交互 较为底层,比较基础的工具类比较多,比如: BeanFactory工具类使用dom4 ...

  10. Opencv Canny

    #include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...