1.原因分析
应用在并发执行该replace into语句的时候会发生死锁,死锁的原因是唯一建冲突了。
执行replace语句时, 如果旧行和新行(要插入的数据)主键或者唯一健冲突的话,replace语句相当于2条sql:
1. delete 老数据;
2. insert 新数据;
注:如果想验证,可以在表上建insert,delete的触发器来测试,会发现replace语句会触发insert和delete的触发器执行
2.解决办法:
多线程环境中尽量不使用replace into语句,将2条sql写到一个事务中
3.具体例子
测试表
CREATE TABLE USER(
id PRIMARY KEY INT,
NAME VARCHAR(20),
PASSWORD VARCHAR(30)
)
并发情况下发生死锁语句
REPLACE INTO USER(ID,NAME,PASSWORD)VALUES(11,'AAA','6666');
拆分语句Java中写在一个事务中处理
DELETE FROM USER WHERE ID=11
INSERT INTO USER(ID,NAME,PASSWORD)VALUES(11,'AAA','6666');