mysql中 replace into 语句使用,并发产生死锁问题浅析_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
2
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 5764 | 回复: 1   主题: mysql中 replace into 语句使用,并发产生死锁问题浅析        上一篇   下一篇 
xicheng.liu
注册用户
等级:中尉
经验:498
发帖:14
精华:0
注册:1970-1-1
状态:离线
发送短消息息给xicheng.liu 加好友    发送短消息息给xicheng.liu 发消息
发表于: IP:您无权察看 2017-3-16 16:31:15 | [全部帖] [楼主帖] 楼主


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');






赞(0)    操作        顶端 
xicheng.liu
注册用户
等级:中尉
经验:498
发帖:14
精华:0
注册:1970-1-1
状态:离线
发送短消息息给xicheng.liu 加好友    发送短消息息给xicheng.liu 发消息
发表于: IP:您无权察看 2017-3-17 12:44:12 | [全部帖] [楼主帖] 2  楼

批量的时候改成INSERT INTO … ON DUPLICATE KEY UPDATE来替代比较好


如上所示修改成

INSERT INTO USER(ID,NAME,PASSWORD)VALUES(11,'AAA','6666'),(12,'BBB','6666')
ON DUPLICATE KEY UPDATE NAME = VALUES(NAME), PASSWORD= VALUES(PASSWORD) ;





赞(0)    操作        顶端 
总帖数
2
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论