最近一个模块执行时数据库老死锁,导致部分用户的数据没有更新。
发生死锁的方法在模块处理的最后数据更新部分,数据库操作如下:
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 死锁情况分析与归纳 #### 案例背景介绍 在实际数据库运维过程中,我们可能会遇到各种各样的问题,其中死锁是一个较为常见也较为棘手的问题之一。本文将以一个具体的案例为基础,对MySQL Innodb...
本篇文章将探讨几种不常见的MySQL InnoDB死锁情况。 一、死锁的概念与产生原因 死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉它们都将无法推进下去。InnoDB引擎通过...
MySQL的InnoDB存储引擎在处理并发事务时可能会遇到死锁问题,这主要发生在多个事务互相等待对方释放资源的情况下。死锁通常由四个必要条件引发: 1. 互斥条件:资源只能被一个事务使用。 2. 请求和保持条件:一个...
何登成在其演讲中深入探讨了MySQL(InnoDB)死锁问题,尤其对于死锁的分析提出了独到的见解和方法。以下是对何登成演讲内容的知识点详细梳理: ### 为什么选择“死锁” 何登成首先分享了他选择探讨死锁话题的原因,...
MySQL的InnoDB存储引擎在处理死锁问题上采用了一系列策略,确保数据库的正常运行和高并发性能。首先,我们需要理解什么是死锁。死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无...
- 事务等待超时:MySQL的InnoDB存储引擎有死锁检测机制,当事务等待超过预设的超时时,会被自动回滚。 - 锁粒度不一致:行级锁与表级锁的混合使用可能导致死锁。 2. **死锁的检测与解决**: - InnoDB存储引擎...
### MySQL Innodb表导致死锁日志情况分析与归纳 #### 概述 在数据库管理领域,特别是针对MySQL的InnoDB存储引擎,了解并解决死锁问题是至关重要的。本文将详细探讨一个具体案例:当备份表格的SQL语句与删除该表...
MySQL数据库死锁是数据库系统中常见...总之,MySQL数据库中的死锁是多并发环境下难以避免的问题,但通过理解死锁的原理、InnoDB的处理机制以及优化代码逻辑,我们可以有效地预防和解决死锁,确保数据库系统的稳定运行。
管中窥豹——MySQL(InnoDB)死锁分析之道 阿里巴巴高级数据库专家
在MySQL中,尤其是在InnoDB存储引擎下,当检测到死锁时,MySQL会自动选择回滚其中一个事务来解除死锁状态。 #### 二、死锁产生的原因 1. **循环等待**:多个事务之间存在循环的资源等待关系。 2. **互斥条件**:...
最近在学习MySQL技术内幕 InnoDB存储引擎 第2版,整理了一些文档分享出来,同时也方便以后查看。若有不当之处,烦请批评指正。 1. MySQL体系结构和存储引擎 2. InnoDB存储引擎 2.1 InnoDB体系结构 2.2 ...
对于MySQL/InnoDB数据库而言,了解死锁的产生机制、分析死锁的方法以及如何预防死锁是非常重要的。 #### 一个不可思议的死锁 假设有一个表`dltask`,其结构如下: ```sql CREATE TABLE dltask ( id bigint ...
在MySQL的InnoDB存储引擎中,一个令人困惑的死锁现象被提出。在描述的死锁场景中,有一个简单的表`dltask`,拥有一个由a、b、c三列组成的唯一索引,以及主键id。事务隔离级别设定为RR(Repeatable Read)。每个事务...
同时,了解InnoDB与其他存储引擎如MyISAM的差异,以及如何处理InnoDB的死锁和表损坏问题,也是提升MySQL数据库管理能力的重要部分。在遇到InnoDB `COUNT(*)` 计算速度慢的问题时,可以考虑使用索引或优化查询语句来...
2013年在中国举办的数据库大会上,主题为“深入解析MySQL InnoDB引擎”的演讲由Calvin Sun(孙春生)进行,他当时是Twitter的高级经理,此前在Oracle和MySQL等公司拥有丰富的经验。在这次大会上,他向与会者深入解析...