org.hibernate.exception.LockAcquisitionException同时选择/插入/删除

时间:2017-10-29 08:21:43

标签: java mysql hibernate

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根本不满意这种方法,因此长期解决方案是避免使用数据库进行锁管理(通过利用消息队列)。与此同时,寻找有意义的解决方法

0 个答案:

没有答案