Asa*_*ika 23 java spring deadlock annotations transactions
在使用Spring(特别是Spring推荐的方法:声明式事务)时,在死锁或锁定超时异常时实现事务重启的最佳实践是什么?
谢谢,
阿萨夫
aar*_*ron 15
我觉得Spring本身应该对这个问题有一个很好的答案(至少是文档形式,或者是某种重试拦截器).唉,事实并非如此.
处理重试的最佳方法(如果你想继续对事物进行"声明")可能是编写自己的拦截器实现,它将自动重试事务一次配置.对于初学者,研究Spring TransactionInterceptor
,它管理声明性事务的开始/回滚/提交行为.如果您正在使用Hibernate,请注意它如何处理Hibernate会话绑定/解除绑定到当前Thread.
如果你正在使用Hibernate,需要注意的事项:
session.clear()
还不够.)MethodInterceptor.invoke()
- MethodInvocation
传入此实例的实例可能是有状态的; 您可能需要在拦截器中使用它之前克隆它.我建议使用类org.springframework.retry.interceptor.RetryOperationsInterceptor
从春天重试项目,配置就像这样:
<aop:config>
<aop:pointcut id="transactional" expression="execution(* com...*Service.remoteCall(..))" />
<aop:advisor pointcut-ref="transactional" advice-ref="retryAdvice" order="-1"/>
</aop:config>
<bean id="retryAdvice" class="org.springframework.retry.interceptor.RetryOperationsInterceptor"/>
Run Code Online (Sandbox Code Playgroud)
但是,如果您仍然希望自己实现它,那么Spring文档中的AOP示例是一个良好的开端.