某日,DBA反映线上数据库报警,检测到死锁,跟踪到发生死锁等待的两条SQL语句分别为:
UPDATE WP_IMAGE_SORT SET GMT_MODIFIED = SYSDATE,IMAGE_IDS = #imageIds# || IMAGE_IDS WHERE MEMBER_ID = #memberId# AND ALBUM_ID = #albumId#
以及
update WP_ALBUM set GMT_MODIFIED = sysdate,
image_count = (select count(*) from wp_image where album_id= #id# and STATUS <![CDATA[<>]]> 'deleted')
where id = #id#
and member_id = #memberId#
回忆大学里的课程,死锁一般是由于资源互相占用并且无法释放导致的,因此重点排查IBANK中相关数据表的操作,发现在saveImg和moveImg两个方法中存在以下逻辑
saveImg
{
……
//Transaction start
appendImageSort(memberId, album.getId(), imgId.longValue());
……
winportAlbumDAO.updateAlbumImageCountAndLastModified(album.getId(), album.getMemberId());
//Transaction end
……
}
moveImg
{
……
//Transaction start
winportAlbumDAO.updateAlbumImageCount(srcAlbumDO.getId(), memberId);
……
imageBO.appendImageSort(memberId, targetAlbumDO.getId(), ids);
//Transaction end
……
}
众所周知,死锁的四要素
1、互斥条件
2、请求与保持条件
3、不剥夺条件
4、循环等待条件
可以看出,前三条的都是事务引起的,因此大家以后要慎用事务处理或者设置事务级别,在确实需要使用事务的时候,请打破循环条件(保持update语句调用顺序的一致性,而非首尾相连的颠倒次序)
和同事聊起事务这类死锁问题的时候,发觉电子支付时这类情况比较常见,比如账户A转账100元到账户B,涉及到事务性的操作(A-100,B+100),如果牵涉到反复倒帐的情况,就有可能发生死锁,据说当初解决的方法,就是在事务当中,统一按照id大小进行处理,即都是先小ID处理,在大ID处理,简单优雅地解决了此类问题
分享到:
相关推荐
35丨记一次线上SQL死锁事故:如何避免死锁?.html
一个经典的获取SQLSERVEr数据库死锁及引起锁定的进程的存储过程。执行时,必须具有数据库超级管理员权限。
记一次排查线上MySQL死锁过程,不能只会curd,还要知道加锁原理.doc
数据库死锁,阻塞查询,杀死死锁,阻塞进程
SQLServer数据库死锁介绍,以及使用独立的事务模拟死锁的产生。
较实用的ORACLE数据库死锁查杀,实用性较强。
分布式课堂上分享讲的ppt,简要介绍了死锁检测的基本概念,以及分布式数据库几种常见的死锁检测算法。
查询SQL server数据库死锁存储过程
服务器运行一天后,就开始频繁报错:Deadlock found when trying to get to lock; try restarting transaction. 死锁的头号原因是外键未加索引,第二号原因是位图索引遭到并发更改;
数据库死锁,导致其他更新操作无法进行 此时需要查询出该死锁的进程,将其杀死
关于Oracle数据库死锁问题的研究与讨论
数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁
解决死锁问题的三种方法:预防死锁,检测死锁及避免死锁。
数据库死锁监控,自动刷新,右键杀死进程,查看存储历史执行时间等信息。
数据库 死锁的解决 其实所有的死锁最深层的原因就是一个:资源竞争 表现一: 一个用户A 访问表A(锁住了表A),然后又访问表B 另一个用户B 访问表B(锁住了表B),然后企图访问表A 这时用户A由于用户B已经锁住表B,它...
判断数据库死锁的SQL,可以检测出死锁的语句和进程
数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁
解决Sybase数据库死锁
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; show status like ‘%lock%’等语句排查详解
SQL Server死锁总结,死锁原理、死锁排查、避免死锁及死锁处理方法,有死锁实例及解决方法