本文只给出现象和解决方法,并没有深度分析原因(mysql功力不够。)
一、表结构
|
|
注意:id是primary key, 四个列组成了unique_key
二、操作
批量写(利用mybatis拼接一个大sql),自动提交
|
|
三、问题
|
|
四、解决方法:
1.经过大神的分析,是因为如下原因造成了死锁
- id是主键,四个列是unique key
- 批量写入,包含on duplicate key操作
- 多个线程并发
会造成死锁问题,具体和mysql insert_buffer好像有什么关系(没细看)
2.dba给的意见是:
- 把唯一键改成主键,这样理论上能降低发生死锁的可能性,程度无法估计;
- 调整程序逻辑,避免在写入过程中的间隙锁导致死锁。这种锁其实和唯一索引的关系都不大,任何索引都有这种间隙锁,并发高的情况下都会发生
- 把事务隔离级别改成 READ COMMITTED,这种改动和现在相比来说会导致一些不可重复读,这得看你们业务方面能不能接受这种情况
3.最终解决:
采用第一种方案,上线后死锁仍然存在,但是明显减少。具体原因会后续分析,先记录一下。
PRIMARY KEY (`app_id`,`collect_time`,`command`,`distribute_type`),