Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
The error may involve com.iss.cms.fdrb.common.dao.entity.InterfaceQueue.updateInterfaceQueue-Inline
The error occurred while setting parameters
SQL: update t_fdrb_interface_queue t set t.send_status = ?, t.update_time = ? where tenant_id = ? and biz_code= ? and biz_id = ? and send_status in (1,3)
Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
; Deadlock found when trying to get lock; try restarting transaction; nested exception is com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:267) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73) at org.mybatis.spring.SqlSessionTemplate
Proxy147.update(Unknown Source)
上面是MySql锁表的问题报错日志,今天记录一下解决方案。
mysql的两情况的锁,排它锁与共享锁。
一般造成死锁的原因是因为两个事务添加了锁的时候没有及时进行释放锁资源,等到第二个事务要添加排他锁的时候,发现已经被锁了,从而导致的环路等待,构成死锁
日志定位可以找到具体的表是什么,然后定位这
从表里面可以发现进行更新的时候,没有用到索引,而是使用两个非索引,类似聚合索引的方式进行更新的处理。
针对这种情况,需要进行调整,先查询出来这一条记录,然后根据主键来进行更新的操作即可。
更改Sql之前
update t_fdrb_interface_queue t set t.send_status = ?, t.update_time = ? where tenant_id = ? and biz_code= ? and biz_id = ? and send_status in (1,3)
更改Sql之后
update t_fdrb_interface_queue t set t.send_status = ?, t.update_time = ? where Id=?
这里备注一下,后续在操作更新的操作时,要使用索引进行更新,避免死锁的情况
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。