日期:2014-05-16  浏览次数:20647 次

一个MySQL死锁问题的解决

PS本人个人情况:

因为我们用的是jbpm4,在100个并发测试下导致数据库死锁,jbpm4封装了插入数据库的操作,jbpm4用得是hibernate对数据库操作,对session的处理貌似没有处理并发的情况,我怀疑是否是这个原因,暂时怀疑,还未深究,我暂时对我们的方法加上synchronized,可以避免数据库死锁,也在寻找更好的解决办法。以下转载是我寻找死锁原因的时候,找到的文章,作为一个知识点留作备用,希望大牛们有更好的解决办法,赐教给小弟。


以下为转载:

http://bbs.chinaunix.net/thread-1854828-1-1.html

近在项目开发过程中,碰到了数据库的死锁问题,在解决问题的过程中,加深了对MySQL InnoDB引擎锁机制的理解。


我们使用Show innodb status检查引擎状态时,发现了死锁问题:

*** (1) TRANSACTION:
TRANSACTION 0 677833455, ACTIVE 0 sec, process no 11393, OS thread id 278546 starting index read
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 320
MySQL thread id 83, query id 162348740 dcnet03 dcnet Searching rows for update
update TSK_TASK set STATUS_ID=1064,UPDATE_TIME=now () where STATUS_ID=1061 and MON_TIME<date_sub(now(), INTERVAL 30 minute)
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 849384 n bits 208 index `PRIMARY` of table `dcnet_db/TSK_TASK` trx id 0 677833455 lock_mode X locks rec but not gap waiting