Transaction And Lock--由Lookup导致的死锁情况
2014-01-16 18:22
288 查看
存在这样情况:
1.表TB1有一列建立索引
2.事务A对表进行更新,先获取对表的X锁以更新基本表中数据,然后对索引申请X锁以更新索引数据。
3.事务B对表进行更新,先获取索引上S锁以使用索引进行Loopup来查询数据,然后申请表的X锁以更新基本表数据
由于事务A和事务B申请到一部分锁资源同时需要对方的锁资源来完成操作,由于锁的不可剥夺性导致死锁产生
等到死锁发生:
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操作
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--唯一索引下INSERT导致的死锁
- Transaction And Lock--由外键导致的死锁
- Transaction And Lock--死锁错误号1205
- 【Mysql】mysql 事务未提交导致死锁 Lock wait timeout exceeded; try restarting transaction 解决办法
- Java输出导致死锁,at java.io.PrintStream.println(PrintStream.java:805) - waiting to lock <0x0000000494fa83
- 并发情况下ReentrantLock死锁
- Transaction And Lock--两种方式实现可重复读
- MySQL Innodb表导致死锁日志情况分析与归纳
- Transaction And Lock--已提交读快照
- Transaction And Lock--READ COMMITTED隔离级别下的"脏读"
- mysql数据库操作缓慢,原来是字段的内容过长导致的,看来cache很有用.报错:Lock wait timeout exceeded; try restarting transaction
- Transaction And Lock--存储过程中使用事务的模板
- Transaction And Lock--在事务中使用TRY CATCH
- 内存释放时的死锁bug导致lock_wait
- Compare PostgreSQL and Oracle dead lock detect and transaction
- Linux 2.6 schedule() 切换进程时没有释放rq->lock却又为何不会导致死锁?
- mysql因为锁等待导致导入用户失败(Lock wait timeout exceeded; try restarting transaction)
- 真实案例:使用Java Thread Dump分析ReadWriteLock导致的死锁问题
- About transaction lock and V$lock view
- mysql数据库死锁:Deadlock found when trying to get lock; try restarting transaction