某次开发是出现了一次事务的异常,首先看一下报错信息:
org.springframework.dao.CannotAcquireLockException:
### Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
### The error may exist in com/mwbg/tucarstatus/dao/ProcessStatusDao.java (best guess)
### The error may involve com.mwbg.tucarstatus.dao.ProcessStatusDao.change-Inline
### The error occurred while setting parameters
### SQL: UPDATE (某个表) SET (某个字段)=? WHERE (id=?)
### Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
; Lock wait timeout exceeded; try restarting transaction; nested exception is com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
后来发现在一个事务中,有两次更新同一条记录的情况,也由此导致了后一次操作操作了之前被锁的一行数据,然后出现了此类异常,还有可能出现这个情况的原因还有如下:
- 1、在同一事务内先后对同一条数据进行插入和更新操作;
- 2、多台服务器操作同一数据库;
- 3、瞬时出现高并发现象;
- 参考 MySQL事务锁问题-Lock wait timeout exceeded
故只需要解决在一个事务内不同时操作一条记录即可
业务逻辑是这样的:
A业务负责修改一张表table_a,B业务调用A业务,同时自己修改表table_b,这个时候,B业务又自行修改了table_a造成了该行被锁。
网友评论