目录

  • 场景描述
  • 问题分析
  • 解决方法
  • 延伸:数据库死锁
  • 数据库死锁例子

正文

回到顶部

场景描述

在update表的时候出现DeadlockLoserDataAccessException异常 (Deadlock found when trying to get lock; try restarting transaction...)。

回到顶部

问题分析

这个异常并不会影响用户使用,因为数据库遇到死锁会自动回滚并重试。用户的感觉就是操作稍有卡顿。但是监控老是报异常,所以需要解决一下。

回到顶部

解决方法

在应用程序中update的地方使用try-catch。

我自己封装了一个函数,如下。

/*** 2016-03-15* linxuan* handle deadlock while update table*/private void updateWithDeadLock(TestMapper mapper, Test record) throws InterruptedException {boolean oops;int retries = 5;do{oops = false;try{mapper.updateByPrimaryKeySelective(record);}catch (DeadlockLoserDataAccessException dlEx){oops = true;Thread.sleep((long) (Math.random() * 500));}finally {}} while(oops == true && retries-- >0);}

我用的是mybatis,所以只需将mapper传进函数,如果不用mybatis,需要自己创建并关闭数据库连接。

回到顶部

延伸:数据库死锁

数据库死锁是事务性数据库 (如SQL Server, MySql等)经常遇到的问题。除非数据库死锁问题频繁出现导致用户无法操作,一般情况下数据库死锁问题不严重。在应用程序中进行try-catch就可以。那么数据死锁是如何产生的呢?

InnoDB实现的是行锁 (row level lock),分为共享锁 (S) 和 互斥锁 (X)。

  • 共享锁用于事务read一行。
  • 互斥锁用于事务update或delete一行。

当客户A持有共享锁S,并请求互斥锁X;同时客户B持有互斥锁X,并请求共享锁S。以上情况,会发生数据库死锁。如果还不够清楚,请看下面的例子。

回到顶部

数据库死锁例子

首先,客户A创建一个表T,并向T中插入一条数据,客户A开始一个select事务,所以拿着共享锁S。

mysql> CREATE TABLE t (i INT) ENGINE = InnoDB;
Query OK, 0 rows affected (1.07 sec)mysql> INSERT INTO t (i) VALUES(1);
Query OK, 1 row affected (0.09 sec)mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)mysql> SELECT * FROM t WHERE i = 1 LOCK IN SHARE MODE;
+------+
| i    |
+------+
|    1 |
+------+

然后,客户B开始一个新事务,新事务是delete表T中的唯一一条数据。

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)mysql> DELETE FROM t WHERE i = 1;

删除操作需要互斥锁 (X),但是互斥锁X和共享锁S是不能相容的。所以删除事务被放到锁请求队列中,客户B阻塞。

最后,客户A也想删除表T中的那条数据:

mysql> DELETE FROM t WHERE i = 1;
ERROR 1213 (40001): Deadlock found when trying to get lock;
try restarting transaction

死锁产生了!因为客户A需要锁X来删除行,而客户B拿着锁X并正在等待客户A释放锁S。看看客户A,B的状态:

  • 客户A: 拿着锁S,等待着客户B释放锁X。
  • 客户B: 拿着锁X,等待着客户A释放锁S。

发生死锁后,InnoDB会为对一个客户产生错误信息并释放锁。返回给客户的信息:

ERROR 1213 (40001): Deadlock found when trying to get lock;
try restarting transaction

所以,另一个客户可以正常执行任务。死锁结束。

参考资料:

http://dev.mysql.com/doc/refman/5.7/en/innodb-deadlocks.html

http://www.xaprb.com/blog/2006/08/03/a-little-known-way-to-cause-a-database-deadlock/

InnoDB数据库死锁相关推荐

  1. 一次诡异的数据库死锁问题排查过程

    GitHub 1.8k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 1.8k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 1.8k Star 的 ...

  2. 一次诡异的数据库死锁问题排查过程 1

    GitHub 1.8k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 1.8k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 1.8k Star 的 ...

  3. 【MySQL】数据库死锁查询及处理

    数据库死锁 数据库死锁是事务性数据库 (如SQL Server, MySql等)经常遇到的问题.除非数据库死锁问题频繁出现导致用户无法操作,一般情况下数据库死锁问题不严重.在应用程序中进行try-ca ...

  4. mysql数据库死锁检测_数据库死锁检测和解决方式

    做性能测试或者线上环境并发量比较大的时候经常出现数据库死锁的情况,下面介绍几种数据库死锁的检测方式和解决方式.都是采用sql命令实现的.如果不用命令行也可以通过查看数据库服务器的日志信息进行死锁检测, ...

  5. 数据库死锁产生原因及场景

    什么是数据库死锁? 两个或以上事务同时对一批资源占用锁,并形成循环,就会造成事务死锁,一般报错如下: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionR ...

  6. Java面试必问:死锁(多线程死锁+数据库死锁)

    死锁 接下来从几个方面介绍: 多线程死锁 多线程死锁解决办法 数据库死锁 数据库死锁解决办法 多线程死锁是怎么造成的? 多线程锁定同一资源会造成死锁 线程池中的任务使用当前线程池也可能出现死锁 参考连 ...

  7. 记一次mysql数据库死锁实验

    概述 之前接触到的数据库死锁,很多都是批量更新时加锁顺序不一致而导致的死锁,但是上周却遇到了一个很难理解的死锁.借着这个机会又重新学习了一下mysql的死锁知识以及常见的死锁场景.今天不介绍死锁的基本 ...

  8. 如何不停机迁移一个mysql INNODB 数据库?

    2019独角兽企业重金招聘Python工程师标准>>> 如何不停机迁移一个mysql INNODB 数据库? http://www.itpub.net/thread-1776724- ...

  9. 查询Sqlserver数据库死锁的一个存储过程

    使用sqlserver作为数据库的应用系统,都避免不了有时候会产生死锁, 死锁出现以后,维护人员或者开发人员大多只会通过sp_who来查找死锁的进程,然后用sp_kill杀掉.利用sp_who_loc ...

最新文章

  1. glVertexAttribPointer第一个参数理解
  2. 201506230818_《JavaScript权威指南(第六版)——callee和caller、对象属性用作实参、自定义函数属性》(P175-180)...
  3. 【CCF】201503-1图像旋转
  4. Linux中级之netfilter防火墙(iptables)
  5. 【使用指南】ComponentOne Enterprise .NET开发控件集
  6. php生成流水号,生成唯一流水号
  7. Google奥运会彩蛋,你确定不来参加一下吗?
  8. 婴儿级教学,手伤害教你用鸿蒙OS获取B站粉丝数!!
  9. 支付宝小程序设置服务器维护,教程|如何开发支付宝小程序服务端:蚂蚁金融云...
  10. C语言为何不会过时?你需要掌握多少种语言?
  11. 中山マミ - 咲く未来
  12. 你的Idea还可用吗?不妨试试另一个开发神器!
  13. 相位式激光测距全套方案
  14. 有限元 弧长法 matlab,有没有有关弧长法的程序!!!
  15. python 文件操作常用轮子
  16. mysql主键标识_实体标识与数据库主键
  17. Python数组中除以0但却不想报错处理方法
  18. 浙江义乌外商当志愿者助力春运 一口流利汉语获赞
  19. 文件粉碎机(file pulverizer) v4.2 怎么用
  20. 基于RV1126 Video分析-----sensor 的 media模块注册

热门文章

  1. SAR相关指标_sinc函数与SAR点目标聚焦指标——分辨率、峰值旁瓣比、积分旁瓣比
  2. 加班少的真实原因是啥?
  3. 元旦放假值班安排 DNSPod节假日服务不休假
  4. iPad Swift Playgrounds中实现AR 3D物体识别
  5. 2018JAVA编程实战+ 办公自动化OA项目实例
  6. 这些年做项目带新人的经验总结
  7. git命令学习笔记1(路飞学城)
  8. 图像清晰度计算的3种方法
  9. 尽快下载Navicat-Premium-12.0.26含注册机
  10. org.apache.ibatis.binding.BindingException: Type interface org.aptech.hdax.dao.BuoKeDao is not known