这些是我在应用程序中使用的规范
我面临的问题是与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
如何通过弹簧配置实现这一目标,还是需要手动解决问题?
提前致谢!