MySQL死锁问题分析及解决方法实例详解(3)

时间:2017-06-15 17:48

当“update tab_test set state=1064,time=now() where state=1061 and time < date_sub(now(), INTERVAL 30 minute)”执行时,MySQL会使用idx_1索引,因此首先锁定相关的索引记录,因为idx_1是非主键索引,为执行该语句,MySQL还会锁定主键索引。

假设“update tab_test set state=1067,time=now () where id in (9921180)”几乎同时执行时,本语句首先锁定主键索引,由于需要更新state的值,所以还需要锁定idx_1的某些索引记录。

这样第一条语句锁定了idx_1的记录,等待主键索引,而第二条语句则锁定了主键索引记录,而等待idx_1的记录,这样死锁就产生了。

6、解决办法

拆分第一条sql,先查出符合条件的主键值,再按照主键更新记录:

select id from tab_test where state=1061 and time < date_sub(now(), INTERVAL 30 minute);

update tab_test state=1064,time=now() where id in(......); 

至此MySQL死锁问题得以解决!

【编辑推荐】

数据库表设计,没有最好只有最适合

MySQL服务器发现大量TIME_WAIT解决办法

MySQL表名忽略大小写问题记录

数据库压缩技术探索

恢复控制文件后如何避免resetlogs打开数据库?

  • A+
所属分类:MySQL