Transaction And Lock--唯一索引下INSERT导致的死锁
2014-03-05 14:57
288 查看
背景:
曾经的一位同事问我:"数据库只有并发INSERT 操作,会造成死锁么?",我没有太多思考地回答"不会",但真的不会吗?
测试:
在上面的两个回话中,由于主键(唯一约束)的限制,相同的key对应相同的lock Resource,导致需要等待对方所获取的lock Resource,从而引发死锁
而如果将主键修改为非唯一索引,则不会引发死锁,相同的key对应不相同的lock Resource,因此不会造成相互等待也不引发死锁。
--====================================================================
--华丽的PS
对于最常见的死锁场景:
事务1 获取表TB1上的资源,请求表TB2上的资源
事务2 获取表TB2上的资源,请求表TB1上的资源
很多开发人员都会有意识保证各个事务访问不同表的顺序,从而避免此类死锁的发生,但很少会考虑对相同表的访问顺序,尤其在输入值被参数化的情况,如在下面的情况下:
在考虑是否会引发死锁时,我们除了分析当前语句外,还得检查这些语句所涉及到的表相关对象:触发器+外键+索引,还需分析其他业务场景的潜在影响。
PS:很多我们自认为正确的小结论,洗洗(细细)分析下,根本就是错误,而这些西奥结论,可能造成很恶劣影响。
--========================================================
照例妹子镇贴
![](http://images.cnitblog.com/i/174228/201403/051450397531926.jpg)
图片来源于一豆瓣友邻
曾经的一位同事问我:"数据库只有并发INSERT 操作,会造成死锁么?",我没有太多思考地回答"不会",但真的不会吗?
测试:
--================================= --创建测试表 CREATE TABLE TB3 ( ID INT PRIMARY KEY ) GO --=================================== --新开回话1 BEGIN TRAN INSERT INTO TB3 SELECT 2 WAITFOR DELAY '0:0:10' INSERT INTO TB3 SELECT 1 --=================================== --新开回话2 BEGIN TRAN INSERT INTO TB3 SELECT 1 WAITFOR DELAY '0:0:10' INSERT INTO TB3 SELECT 2
在上面的两个回话中,由于主键(唯一约束)的限制,相同的key对应相同的lock Resource,导致需要等待对方所获取的lock Resource,从而引发死锁
而如果将主键修改为非唯一索引,则不会引发死锁,相同的key对应不相同的lock Resource,因此不会造成相互等待也不引发死锁。
--====================================================================
--华丽的PS
对于最常见的死锁场景:
事务1 获取表TB1上的资源,请求表TB2上的资源
事务2 获取表TB2上的资源,请求表TB1上的资源
很多开发人员都会有意识保证各个事务访问不同表的顺序,从而避免此类死锁的发生,但很少会考虑对相同表的访问顺序,尤其在输入值被参数化的情况,如在下面的情况下:
BEGIN TRAN UPDATE TB1 SET C2=@P2 WHERE C1=@P1 UPDATE TB1 SET C2=@P3 WHERE C1=@P3 COMMIT
在考虑是否会引发死锁时,我们除了分析当前语句外,还得检查这些语句所涉及到的表相关对象:触发器+外键+索引,还需分析其他业务场景的潜在影响。
PS:很多我们自认为正确的小结论,洗洗(细细)分析下,根本就是错误,而这些西奥结论,可能造成很恶劣影响。
--========================================================
照例妹子镇贴
![](http://images.cnitblog.com/i/174228/201403/051450397531926.jpg)
图片来源于一豆瓣友邻
相关文章推荐
- linux中screen命令的使用
- WEB容器启动之Web.xml加载顺序
- eclipse调优
- iOS 推送通知详解
- Apache 门户项目组介绍
- 配置Jenkins的slave节点的详细步骤适合windows等其他平台
- C语言实现二叉树的基本操作---创建、遍历、求深度、求叶子结点
- mysql模拟题二
- Hive中小表与大表关联(join)的性能分析
- windows phone xaml文件中元素及属性(10)
- POJ 3264 Balanced Lineup -- RMQ或线段树
- str_replace使用
- Linux系统基础-管理之系统启动过程及系统初始化学习总结
- LeetCode OJ --问题与解答 Binary Tree Preorder Traversal
- java求100以内的素数示例分享
- 跟一下wpa_supplicant(1) 初始化
- 淘宝api的简单调用
- Jetty 的工作原理以及与 Tomcat 的比较
- 小心删除容器中元素时的迭代器失效
- windows phone 墓碑化(9)