如何避免javax.persistence.RollbackException:标记为rollbackOnly的事务

时间:2016-08-29 06:44:07

标签: mysql spring transactions spring-data spring-data-jpa

这些是我在应用程序中使用的规范

  • Spring 4.0.0
  • Spring数据版本1.10.1.RELEASE
  • Aspect-J版本1.8.9
  • Spring-Retry版本1.1.2.RELEASE

我面临的问题是与spring数据中的并发事务相关的异常。

有许多用户同时登录到应用程序并同时访问数据库表的一行。

为了避免脏读,我在repository layer中使用过悲观锁定,例如

@Lock(LockModeType.PESSIMISTIC_WRITE)
Wallet findOne(Long id);

并将方法注释为事务性,并将方法注释为@Retryable,以便在某些例外情况下重试该方法,如下所示

    @Transactional(isolation = Isolation.READ_COMMITTED, noRollbackFor = {LockAcquisitionException.class})
    @Retryable(value = {LockAcquisitionException.class}, maxAttempts = 5)
        public Wallet doOperations() {
          ......
            }

当上述方法发生多个同时命中时,会抛出一些异常,如下所示:

2016-08-29 11:39:03 ERROR [SqlExceptionHelper:logExceptions->146] - Deadlock found when trying to get lock; try restarting transaction
javax.persistence.RollbackException: Transaction marked as rollbackOnly

但是我需要事务重新执行而不是抛出异常,如下所示。

javax.persistence.RollbackException: Transaction marked as rollbackOnly

如何通过弹簧配置实现这一目标,还是需要手动解决问题?

提前致谢!

0 个答案:

没有答案