某日,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
- 事务回滚:数据库管理系统会自动检测到死锁,并选择一个事务进行回滚以打破死锁。 - 手动干预:管理员可以通过终止特定事务、调整事务的执行顺序或优化SQL语句来避免死锁。 - 设置超时:为事务设置超时限制,超时...
一个经典的获取SQLSERVEr数据库死锁及引起锁定的进程的存储过程。执行时,必须具有数据库超级管理员权限。
在数据库管理中,死锁是一个常见的问题,尤其是在高并发的环境中。死锁指的是两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉它们将无法继续执行。本篇文章将详细讲解如何查看和...
SQLServer数据库死锁介绍,以及使用独立的事务模拟死锁的产生。
针对这一问题,数据库管理系统通常采用三种策略来解决:预防死锁、检测死锁以及避免死锁。 ### 预防死锁 预防死锁是最为保守的策略,其核心思想是在事务开始前就尽可能避免死锁的发生。这主要通过以下几种方式实现...
分布式课堂上分享讲的ppt,简要介绍了死锁检测的基本概念,以及分布式数据库几种常见的死锁检测算法。
标题和描述中提到的事件是一次在线MySQL数据库发生的死锁问题,这突显了了解数据库加锁原理的重要性,而不仅仅是基础的CRUD操作。死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无...
### 数据库死锁解决方案详解 ...此外,合理设计事务逻辑、优化数据库结构以及提高SQL语句的执行效率,都是预防死锁的有效措施。在实际开发过程中,开发者应当密切关注这些方面,以确保数据库系统的稳定运行。
### ORACLE数据库死锁查杀方法详解 #### 一、引言 在Oracle数据库系统中,当两个或多个事务在等待对方释放资源时,就会出现死锁现象。死锁不仅会降低系统的整体性能,还可能导致某些重要事务长时间无法完成,严重...
数据库死锁,导致其他更新操作无法进行 此时需要查询出该死锁的进程,将其杀死
关于Oracle数据库死锁问题的研究与讨论
数据库死锁监控,自动刷新,右键杀死进程,查看存储历史执行时间等信息。
Oracle数据库死锁是数据库系统中常见的问题,它发生在两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象。当这种情况发生时,如果没有外力干预,这些事务都将无法继续执行,形成一种僵局。了解如何...
MySQL数据库死锁是数据库系统中常见的问题,它发生在两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉它们将无法继续执行。了解和处理死锁是数据库管理员和开发人员必备的技能。...
数据库死锁分析是数据库设计、开发和运行维护中非常重要的一个问题,需要严格遵守《数据库设计规范》,使用行锁和控制事务的执行时间,避免死锁的产生,并定期检查数据库日志,自动解开死锁,避免死锁对数据库的影响...
数据库死锁是数据库管理系统中常见的问题,特别是在并发环境中。死锁发生时,两个或多个事务在等待对方释放资源,导致所有事务都无法继续执行,系统陷入僵局。为了解决这个问题,"数据库死锁检测工具"应运而生,它...
判断数据库死锁的SQL,可以检测出死锁的语句和进程
### SQL Server 数据库死锁查询存储过程解析 #### 标题与描述理解 标题与描述均指出本篇讨论的主题是“查询SQL Server数据库死锁存储过程”。这表明文章旨在介绍一个用于检测SQL Server环境中发生的死锁现象的...