设为首页 收藏本站
查看: 1285|回复: 0

[经验分享] mysql 报ERROR:Deadlock found when trying to get lock; try restarting transaction

[复制链接]

尚未签到

发表于 2017-12-12 23:32:00 | 显示全部楼层 |阅读模式
  今天在补以前数据的时候程序突然报如下错误:
  

[2017-02-10 13:12:06.678] [INFO] mysqlLog - update tbl_playerdata_error: { [Error: ER_LOCK_DEADLOCK: Deadlock found when trying to get lock; try restarting transaction]  code:
'ER_LOCK_DEADLOCK',  errno:
1213,  sqlState:
'40001',  index:
0 }  

  一看就是mysql出现了死锁问题,其实上面跑的程序在测试服跑了好久都没什么问题,为什么在正式服上会出现mysql的死锁问题呢,第一反应是不是数据量太大(3百多万条),可是也不可能啊,再说死锁和这些有什么鸡毛的关系,马丹看来要好好解决下了。
  我的分析是:由于现在处理的是正式服的数据,而正式服还有许多用户在操作,应该是在用户查询,或者是其他操作的时候,和我这边的数据更新产生了死锁(首先说明使用的是:InnoDB存储引擎。由于用户那边的查询或者其他操作锁定了我需要的资源,而我这边更新也锁定了用户操作的一部分资源,两边都等着对方释放资源,从而导致死锁)。
  知道错误code之后,先来查看mysql的说明,关于上面的 Error: 1213 SQLSTATE: 40001,参见:Server Error Codes and Messages
  

Message: Deadlock found when trying to get lock; try restarting transaction  

  
InnoDB reports
this error when a transaction encounters a deadlock and is automatically rolled back so that your application can take corrective action. To recover from this error, run all the operations in this transaction again. A deadlock occurs when requests for locks arrive in inconsistent order between transactions. The transaction that was rolled back>  

  上面有两句:
  

To recover from this error, run all the operations in this transaction again  If you encounter frequent deadlocks, make the sequence of locking operations (LOCK TABLES, SELECT ... FOR UPDATE, and so on)
  consistent between the different transactions or applications that experience the issue
  

  

  这两句也就道出了处理死锁的方法了,我就是在死锁错误发生的时候,使用定时器再重新做一次更新操作,这样就避免了上面出现的问题。
  另外,参考了stack overflow上面一个回答:http://stackoverflow.com/questions/2332768/how-to-avoid-mysql-deadlock-found-when-trying-to-get-lock-try-restarting-trans
  

One easy trick that can help with most deadlocks is sorting the operations in a specific order.  

  
You
get a deadlock when two transactions are trying to lock two locks at opposite orders, ie:  

  
connection
1: locks key(1), locks key(2);  
connection
2: locks key(2), locks key(1);  
If both run at the same time, connection
1 will lock key(1), connection 2 will lock key(2) and each connection will wait for the other to>
  
Now,
if you changed your queries such that the connections would lock the keys at the same order, ie:  

  
connection
1: locks key(1), locks key(2);  
connection
2: locks key(1), locks key(2);  
it will be impossible to
get a deadlock.  

  
So
this is what I suggest:  

  
Make sure you have no other queries that
lock access more than one key at a time except for the delete statement. if you do (and I suspect you do), order their WHERE in (k1,k2,..kn) in ascending order.  
Fix your delete statement to work
in ascending order:  
Change
  

  
DELETE FROM onlineusers WHERE datetime
<= now() - INTERVAL 900 SECOND  
To
  

  
DELETE FROM onlineusers WHERE>  WHERE datetime
<= now() - INTERVAL 900 SECOND order by>
Another thing to keep
in mind is that mysql documentation suggest that in case of a deadlock the client should retry automatically. you can add this logic to your client code. (Say, 3 retries on this particular error before giving up).  

  参考:http://blog.sina.com.cn/s/blog_4acbd39c01014gsq.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-423498-1-1.html 上篇帖子: mysql中查看索引是否被使用到 下篇帖子: MySQL之desc查看表结构的详细信息
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表