`
grunt1223
  • 浏览: 423248 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

一例线上数据库死锁的排查,以及引起的思考

阅读更多
某日,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处理,简单优雅地解决了此类问题
2
1
分享到:
评论
1 楼 liangguanhui 2010-12-28  
引用
在事务当中,统一按照id大小进行处理,即都是先小ID处理,在大ID处理,简单优雅地解决了此类问题
赞一个,方法挺好的。

相关推荐

    35丨记一次线上SQL死锁事故:如何避免死锁?.html

    35丨记一次线上SQL死锁事故:如何避免死锁?.html

    sql数据库死锁查询工具

    - 事务回滚:数据库管理系统会自动检测到死锁,并选择一个事务进行回滚以打破死锁。 - 手动干预:管理员可以通过终止特定事务、调整事务的执行顺序或优化SQL语句来避免死锁。 - 设置超时:为事务设置超时限制,超时...

    获取数据库死锁信息过程

    一个经典的获取SQLSERVEr数据库死锁及引起锁定的进程的存储过程。执行时,必须具有数据库超级管理员权限。

    查看数据库死锁信息

    在数据库管理中,死锁是一个常见的问题,尤其是在高并发的环境中。死锁指的是两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉它们将无法继续执行。本篇文章将详细讲解如何查看和...

    数据库死锁原理实验

    SQLServer数据库死锁介绍,以及使用独立的事务模拟死锁的产生。

    数据库死锁-解决死锁问题的三种办法

    针对这一问题,数据库管理系统通常采用三种策略来解决:预防死锁、检测死锁以及避免死锁。 ### 预防死锁 预防死锁是最为保守的策略,其核心思想是在事务开始前就尽可能避免死锁的发生。这主要通过以下几种方式实现...

    分布式数据库死锁检测算法分析

    分布式课堂上分享讲的ppt,简要介绍了死锁检测的基本概念,以及分布式数据库几种常见的死锁检测算法。

    记一次排查线上MySQL死锁过程,不能只会curd,还要知道加锁原理.doc

    标题和描述中提到的事件是一次在线MySQL数据库发生的死锁问题,这突显了了解数据库加锁原理的重要性,而不仅仅是基础的CRUD操作。死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无...

    数据库 死锁的解决

    ### 数据库死锁解决方案详解 ...此外,合理设计事务逻辑、优化数据库结构以及提高SQL语句的执行效率,都是预防死锁的有效措施。在实际开发过程中,开发者应当密切关注这些方面,以确保数据库系统的稳定运行。

    较实用的ORACLE数据库死锁查杀

    ### ORACLE数据库死锁查杀方法详解 #### 一、引言 在Oracle数据库系统中,当两个或多个事务在等待对方释放资源时,就会出现死锁现象。死锁不仅会降低系统的整体性能,还可能导致某些重要事务长时间无法完成,严重...

    数据库死锁,导致其他更新操作无法进行

    数据库死锁,导致其他更新操作无法进行 此时需要查询出该死锁的进程,将其杀死

    关于Oracle数据库死锁问题的研究与讨论

    关于Oracle数据库死锁问题的研究与讨论

    数据库死锁监控.exe

    数据库死锁监控,自动刷新,右键杀死进程,查看存储历史执行时间等信息。

    Oracle数据库死锁查询语句

    Oracle数据库死锁是数据库系统中常见的问题,它发生在两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象。当这种情况发生时,如果没有外力干预,这些事务都将无法继续执行,形成一种僵局。了解如何...

    MYSQL 数据库死锁

    MySQL数据库死锁是数据库系统中常见的问题,它发生在两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉它们将无法继续执行。了解和处理死锁是数据库管理员和开发人员必备的技能。...

    数据库死锁分析.doc

    数据库死锁分析是数据库设计、开发和运行维护中非常重要的一个问题,需要严格遵守《数据库设计规范》,使用行锁和控制事务的执行时间,避免死锁的产生,并定期检查数据库日志,自动解开死锁,避免死锁对数据库的影响...

    数据库死锁检测工具

    数据库死锁是数据库管理系统中常见的问题,特别是在并发环境中。死锁发生时,两个或多个事务在等待对方释放资源,导致所有事务都无法继续执行,系统陷入僵局。为了解决这个问题,"数据库死锁检测工具"应运而生,它...

    数据库死锁判断SQL

    判断数据库死锁的SQL,可以检测出死锁的语句和进程

    查询SQL server数据库死锁存储过程

    ### SQL Server 数据库死锁查询存储过程解析 #### 标题与描述理解 标题与描述均指出本篇讨论的主题是“查询SQL Server数据库死锁存储过程”。这表明文章旨在介绍一个用于检测SQL Server环境中发生的死锁现象的...

Global site tag (gtag.js) - Google Analytics