最近一个模块执行时数据库老死锁,导致部分用户的数据没有更新。
发生死锁的方法在模块处理的最后数据更新部分,数据库操作如下:
updateScore{
winuser = getUserById(winId); //for update形式
//设置winuser
update winuser
winAward(winuser); //奖励
updateGroupScore(winuser.getGroup())
loseruser = getUserById(loserId); //for update形式
//设置loseruser
Update(loseruser)
loserAward(loseruser)
updateGroupScore(loseruser.getGroup());
}
死锁发生在updateGroupScore的时候。导致winAward(),loserAward()也回滚。
用户部分发生争锁的情况可能性要低。锁应该是两个事务对更新组时发生。发生的相互持有对方的锁且又等待对方释放锁时发生的。以简单的两个事务为例:
Transaction1: tranaction2:
updateGroupScore 5 //锁住 group 5
updateGroupScore 2 //锁住 group 2
updateGroupScore 2 //waiting lock 2
updateGroupScore 5 //waiting lock 5
此时死锁就发生了。
何况这样操作的事务有很多,多个事务间相互等锁的几率就更大了。
目前想到方法:
- 1. 在这个方法中加了个锁.
- 2. 将winner, loser的处理分开,分成两个事务处理。这样在updateGroupScore就不会等锁
- 3. 将updateGroupScore抽出, 想另外的方式进行更新。
分享到:
相关推荐
Mysql Innodb死锁情况分析与归纳.docx
数据库也会发生死锁的现象,数据库系统实现了各种死锁检测和死锁超时机制来解除死锁,锁监视器进行死锁检测,MySQL的InnoDB处理死锁的方式是 将持有最少行级排它锁的事务进行回滚,相对比较简单的死锁回滚办法
NULL 博文链接:https://edwin-chen.iteye.com/blog/440645
该文档详细分析了innodb的加锁原理、死锁原因以及处理方式
2015 Oracle 技术嘉年华(OTN)分会场11何登成 - 管中窥豹——MySQL(InnoDB)死锁分析之道
主要介绍了MySQL(InnoDB)是如何处理死锁的,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
管中窥豹——MySQL(InnoDB)死锁分析之道 阿里巴巴高级数据库专家
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; show status like ‘%lock%’等语句排查详解
发现当备份表格的sql语句与删除该表部分数据的sql语句同时运行时,mysql会检测出死锁,并打印出日志
最近在学习MySQL技术内幕 InnoDB存储引擎 第2版,整理了一些文档分享出来,同时也方便以后查看。若有不当之处,烦请批评指正。 1. MySQL体系结构和存储引擎 2. InnoDB存储引擎 2.1 InnoDB体系结构 2.2 ...
MySQL中的死锁是指两个或多个事务在相互等待对方释放资源,导致它们都无法继续执行的情况。解决MySQL中的死锁问题通常涉及多个方面,包括监控死锁、分析死锁原因、优化事务设计以及调整系统配置等。以下是一些解决...
• 并发事务,间隙锁可能互斥 (1)A删除不存在的记录,获取共享间隙锁; (2)B插入,必须获得排他间隙锁,故互斥; • 并发插入相同记录,可能死锁(某一个回滚) ... 可以查看InnoDB的锁情况,也可以调试死锁
innodb GAP LOCK 死锁例子1
1.1 InnoDB死锁 https://dev.mysql.com/doc/refman/5.6/en/innodb-deadlocks.html 死锁是指不同的事务都无法继续的情况,由于每个事务都持有另一个需要的锁导致。因为两个事务都在等待资源可用,所以它们都不会释放...
MySQL死锁问题是很多程序员在项目开发中常遇到的问题,现就MySQL死锁及解决方法详解如下: 1、MySQL常用存储引擎的锁机制 MyISAM和MEMORY采用表级锁(table-level locking) BDB采用页面锁(page-level locking)或表级...
所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁...所以解决死锁主要还是针对于最常用的InnoDB。
主要介绍了详解MySQL中的死锁情况以及对死锁的处理方法,文中主要讨论InnoDB存储引擎中的死锁情况,需要的朋友可以参考下
│ 5_InnoDB死锁发生原理和规避.mp4 │ 6_MySQL字符集和排序规则.mp4 │ 作业.docx │ 锁等待分析.txt │ ├─新版MySQL DBA综合实战班 第08天 │ 1_课堂作业讲解.mp4 │ 2_MySQL乱码原理讲解.mp4 │ 3_MySQL排序...
本文给大家讲解的是mysql数据库InnoDB类型,在update表的时候出现死锁现象的原因及解决办法,有需要的小伙伴可以参考下。