并发环境频繁死锁如何解决
发现一个长期的死锁丢失数据问题
发现数据丢失比较验证,以前知道但是没有量化。 现在脚本记录 发现一天有10来起
环境介绍
3台centos5 mysql5.0.45 web是tomcat java.
是2台机器(web服务器 装有mysql) 同时向db mysql中心服务器 写入数据造成的deadlock 发生数据丢失比如
show innodb status \g 得到如下 结果
------------------------
LATEST DETECTED DEADLOCK
------------------------
110310 11:15:24
*** (1) TRANSACTION:
TRANSACTION 1 2454545738, ACTIVE 0 sec, process no 3501, OS thread id 1195465024 inserting
mysql tables in use 1, locked 1
............................
Bruce_lee(942561070) 19:29:57
ip 10.0.1.1
MySQL thread id 34501, query id 1170219884 prod2a 192.168.10.15 betbrain update
INSERT INTO Out (id, aId, b,c,e,f,g,h,i,k,...) values (8081,5209319,a,47,2,3,null,null,null,4.0,null,'C','N','Y') ,(8082,5209319,a,47,2,4,null,null,null,4.0,null,'C','N','Y')。。。。。 有时候多达一百行
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 345492 n bits 232 index `PRIMARY` of table `db/Out` trx id 0 412100899 lock_mode X insert intention waiting
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
ip 10.0.1.2
MySQL thread id 34533, query id 1170219891 prod2b 192.168.10.25 betbrain update
INSERT INTO Out (id, aId, b,c,e,f,g,h,i,k,...) values (8083,5209320,a,43,1,1,27330,null,null,null,null,'C','N','Y') ,(8084,5209320,a,43,1,1,27357,null,null,null,null,'C','N','Y'))。。。。。 有时候多达一百行
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 0 page no 345492 n bits 232 index `PRIMARY` of table `db/Out` trx id 0 412100900 lock_mode X
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
0: len 8; hex 73757072656d756d; asc supremum;;
*** WE ROLL BACK TRANSACTION (2)
(2) HOLDS THE LOCK(S):
RECORD LOCKS space id 0 page no 2191204 n bits 704 index `idx_BOH_id` of table out` trx id 1 2454545745 lock_mode X locks gap before rec
Record lock
分析原因
192.168.10.15
192.168.10.25
2台同时向机器 ip 10.0.1.1写入不同的 INSERT INTO Out (id, aId, b,c数据
观察在线db 表情况,最理想的情况是192.168.10.15
或者192.168.10.25有一边的数据插入成功. 一般2边插入都失败也就是那个时间点一个数据都没有进入.
类似out这样的每天能发生死锁表有大概5个.
一天少的情况下10起左右
脚本trace1-2周 发现比想象的要严重. 数据清理后还有10起,如果严重的时候估计快16起左右.
能发生死锁表的 记录数目
100万
150万
230万
70万
50万
都是gingle表 类似上面的一次性插入多行数据。
开发架构 java 代码提交的。 在线数据每1秒都在不间断提交数据。(2台web接受外界服务器通过哦tomcat的 java sock不停的推数据到 本身的web服务器。之后web产生sql语句(一个循环分段提交提交 所以上面是。。。。。 有时候多达一百行)插入到中心数据库服务器)
机器已经升级。硬件好一倍死锁减少非常多。现在很少。但还是有, 希望能从根本上解决这个问题。