MySQL一次死锁的问题

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

 一个线上系统,稳定运行了一段时间后突然出现一些死锁情况,程序抛异常类似于下面这样:

 
 
  1. com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction 
  2.         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
  3.         at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39
  4.         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27
  5.         at java.lang.reflect.Constructor.newInstance(Constructor.java:513
  6.         at com.mysql.jdbc.Util.handleNewInstance(Util.java:406
  7.         at com.mysql.jdbc.Util.getInstance(Util.java:381
  8.         at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1045
  9.         at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956
  10.         at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491
  11.         at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423

导致出现问题的SQL是这样的

 
 
  1. insert into xxx (...) 
  2.     select aaa, bbb from dual where not exists ( 
  3.         select * from xxx where aaa = yyy 
  4.     ) 

这是一个我们很常见的场景:先查下某条数据是否存在,若不存在就插入一条。

之所以sql这样写,是为了防止高并发情况下发生唯一性约束冲突的异常,这种先select再insert的写法,被称作conditional insert。这里有一个潜在问题就是内层select会加锁,如果此时另外一个线程也进行查询操作,会直接deadlock。

解决办法也很粗暴:

直接insert,不带任何条件,然后程序里面做下容错,将所有唯一性约束的异常吃掉。

MySQL里面有很多这样看上去很美的写法和功能,真正用了才发现自己掉坑里了。生产环境,还是保守一点好。










本文转自 kevx 51CTO博客,原文链接:http://blog.51cto.com/spinlock/958333,如需转载请自行联系原作者
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
算法 关系型数据库 MySQL
MySQL相关(九)- 死锁的发生和避免
MySQL相关(九)- 死锁的发生和避免
23 0
|
3月前
|
SQL 关系型数据库 MySQL
MySQL事务原理分析(ACID特性、隔离级别、锁、MVCC、并发读异常、并发死锁以及如何避免死锁)
MySQL事务原理分析(ACID特性、隔离级别、锁、MVCC、并发读异常、并发死锁以及如何避免死锁)
86 1
|
4月前
|
关系型数据库 MySQL 调度
KnowStreaming系列教程第四篇——MySQL数据更新死锁问题
KnowStreaming系列教程第四篇——MySQL数据更新死锁问题
41 0
|
4月前
|
SQL 存储 关系型数据库
MySQL 意向共享锁、意向排他锁、死锁
MySQL 意向共享锁、意向排他锁、死锁
46 0
MySQL 意向共享锁、意向排他锁、死锁
|
9月前
|
SQL 监控 算法
MySQL锁定:死锁及其避免方法
MySQL锁定:死锁及其避免方法
|
5月前
|
SQL NoSQL 关系型数据库
Mysql Innodb死锁情况分析与归纳
Mysql Innodb死锁情况分析与归纳
50 0
|
11月前
|
SQL 关系型数据库 MySQL
MySQL - 锁等待及死锁初探
MySQL - 锁等待及死锁初探
121 0
|
6月前
|
存储 SQL 关系型数据库
MySQL 优化 index merge(索引合并)引起的死锁分析(强烈推荐)
生产环境出现死锁流水,通过查看死锁日志,看到造成死锁的是两条一样的update语句(只有where条件中的值不同),如下:
|
6月前
|
SQL 关系型数据库 MySQL
Mysql死亡笔记的死锁记录
Mysql死亡笔记的死锁记录
67 0
|
6月前
|
关系型数据库 MySQL 中间件
MySQL学习笔记-死锁和死锁检测
MySQL学习笔记-死锁和死锁检测
50 0

推荐镜像

更多