nested exception is org.springframework.dao.CannotAcquireLockException: could not execute
statement; SQL [n/a]; nested exception is org.hibernate.exception.LockAcquisitionException: could not execute statement] with root cause
org.mariadb.jdbc.internal.util.dao.QueryException: Deadlock found when trying to get lock; try restarting transaction
我在尝试从Java应用程序的2个独立实例插入mysql数据库时遇到上述异常。它们中的每一个都能够从10个不同的工作者中进行10次并发插入,这足以引起这种情况。
抛出此代码的代码:
@Autowired
org.springframework.transaction.support.TransactionTemplate transactionTemplate;
void process(Long key) {
boolean processed = transactionTemplate.execute(
transactionStatus -> {
acquireLock(key);
try {
return processOneRecord(key);
}
finally {
releaseLock(key);
}
}
);
acquireLock(key);
尝试通过将密钥插入锁表(只有一列,这是密钥)来获取锁。这样做是为了跨实例保证锁定 - 表充当信号量锁表
processOneRecord(key);
执行可能需要几毫秒到几秒的事情
releaseLock(key);
使用delete语句删除锁
当我们得到异常时,我们会睡一段时间并重试,但是,死锁情况仍然存在。
如何解决这个问题?
PS:
DBA根本不满意这种方法,因此长期解决方案是避免使用数据库进行锁管理(通过利用消息队列)。与此同时,寻找有意义的解决方法