首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL批量更新死锁案例分析

问题描述 在做项目的过程中,由于写SQL太过随意,一不小心就抛了一个死锁异常,如下: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException...原因分析 mysql的事务支持与存储引擎有关,MyISAM不支持事务,INNODB支持事务,更新采用的是行级锁。这里采用的是INNODB做存储引擎,意味着会将update语句做为一个事务来处理。...蛋疼的情况出现了,一条语句获取了idx_1上的锁,等待主键索引上的锁;另一条语句获取了主键上的锁,等待idx_1上的锁,这样就出现了死锁。...中,更新操作默认会加行级锁,行级锁是基于索引的,在分析死锁之前需要查询一下mysql的执行计划,看看是否用到了索引,用到了哪个索引,对于没有用索引的操作会采用表级锁。...在并发度高的应用中,批量更新一定要带上记录的主键,优先获取主键上的锁,这样可以减少死锁的发生。

2.1K40
您找到你想要的搜索结果了吗?
是的
没有找到

MySQL 使用 for update 引发死锁原因分析

在之前的一次开发需求中使用了 for update 实现悲观锁,最后导致出现了很多的 MySQL 死锁报警,现记录下死锁产生的原因。...,更新数据分为两个步骤查询子任务最终的状态修改任务的状态为了保证数据在并发情况下的正确性,当时想到的是保证查询和修改是一个原子性操作,所以决定在查询使用 for update 对查询到的数据加锁。...但是后来发现这个修改逻辑造成 MySQL 死锁。...死锁原因分析造成死锁的原因主要和 for update 对数据加锁的过程有些关系,加锁过程描述:MySQL innodb 存储引擎默认的隔离级别 RR 级别,而RR隔离级别,默认是使用Next-key...MySQL 锁类型总结MySQL 间隙锁,锁过程详解

60740

在编写异步方法使用 ConfigureAwait(false) 避免使用死锁

在编写异步方法使用 ConfigureAwait(false) 避免使用死锁 发布于 2018-03-23 13:54...更新于 2018-03-24 05:21 我在 使用 Task.Wait()?...立刻死锁(deadlock) 一文中站在类库使用者的角度看 async/await 代码的死锁问题;而本文将站在类库设计者的角度来看死锁问题。...立刻死锁(deadlock) 一文中说的那种死锁,详情可进去看原因。 那么现在做一个调查,你认为下面三种 RunAsync 的实现中,哪些会在碰到这种不省心的类库使用发生死锁呢? ?...这样,当你在代码中写出 await ,分析器会提示你 CA2007 警告,你必须显式设置 ConfigureAwait(false) 或 ConfigureAwait(true) 来提醒你是否需要使用默认的

64710

mysql 唯一键冲突与解决冲突死锁风险

唯一键冲突与解决方案 在业务中,我们为了保证符合某些条件的行的唯一性,在 mysql 表创建通过 UNIQUE KEY 来限制唯一键是一个很好的习惯。...使用方法 mysql 提供的 replace into 语句实现了有则更新无则插入的效果,使用也很简单。...在其后的 update 语句中,mysql 允许使用者将任意字段更新为任何值,而不仅仅局限于 insert 语句中预先指定的值。...但根据我们上面所介绍的,这些事务在执行 insert 语句,同样要去获取插入意向锁,于是和 replace into 一样也会出现死锁的问题。...事实上,开启主动死锁检测 innodb_deadlock_detect,在死锁发生立即返回错误,在业务代码中增加重试机制,就可以有效处理问题了。

3.8K41

使用mysql事务不同场景导致的死锁问题以及解决方法

2.执行事务中SQL语句on duplicate使用不当致死锁 使用MYSQL的抢购活动中为防止并发抢购而update 带条件自增导致死锁(这里只说使用MYSQL特定场景可能遇到的问题,至于使用MYSQL...性能问题可以另外讨论) 小量的抢购活动使用MYSQL防止优惠被刷我们常用下面SQL,通过DB对同一条记录的串行更新来防止并发请求 update tableA set num=num+1 where .....id=58637) insert...on duplicate key update; 3.使用MYSQL事务异常分支未回滚事务导致行死锁(异常现象多为:同一接口某个或某些用户请求不可用) mysql...InnoDB存储引擎为我们使用事务带来了巨大便利,但是事务异常处理不当出现异常分支未捕获并回滚事务可能会导致死锁,建议使用事务小心处理,对各个可能的异常分支都要对事务进行回滚。...结论:使用mysql过程中可能遇到各种死锁的坑,这里只简单列举了常用的几点,后续继续补充。 参考资料 https://bugs.mysql.com/bug.php?id=52020

1.9K40

Mysql查询语句使用select.. for update导致的数据库死锁分析

近期有一个业务需求,多台机器需要同时从Mysql一个表里查询数据并做后续业务逻辑,为了防止多台机器同时拿到一样的数据,每台机器需要在获取锁住获取数据的数据段,保证多台机器不拿到相同的数据。...我们Mysql的存储引擎是innodb,支持行锁。...下面说下mysql for update导致的死锁。...比如这里更新400000会被阻塞,但更新400031不会被阻塞。 我们项目出现死锁,就是这个原理,一条sql语句先锁主键索引,再锁非主键索引;另外一条sql语句先锁非主键索引,再锁主键索引。...虽然两个sql语句期望锁的数据行不一样,但两个sql语句查询或更新的条件或结果字段如果有相同列,则可能会导致互相等待对方锁,2个sql语句即引起了死锁

3.4K10

使用Koa + mysql一小搭建个人博客

koa插件选择 路由:koa-router 表单解析:koa-bodyparser 视图:koa-views、ejs session: koa-session-minimal、koa-mysql-session...数据库引擎: mysql 数据库设计 用户表(users):id、name、pass 文章表(posts):id、name、title、content、uic、moment、comments、pv...评论表(comment):id、name、content、postid 数据库初始化 使用连接池连接数据库,每次查询完毕之后释放链接,可以将数据表的建立在mysql.js中完成,为每一次query创建一个公共函数..., 并且每次查询都封装为一个方法,如下: const mysql = require('mysql'); const config = require('./...../config/default'); const pool = mysql.createPool({ host: config.database.HOST, port: config.database.PORT

1.5K30
领券