如何在春季死锁/锁定超时时重新启动交易?
2022-09-01 17:34:08
在使用Spring时,在死锁或锁定超时异常时实现事务重新启动的最佳实践是什么(特别是Spring推荐的方法:声明性事务)?
谢谢
阿萨夫
在使用Spring时,在死锁或锁定超时异常时实现事务重新启动的最佳实践是什么(特别是Spring推荐的方法:声明性事务)?
谢谢
阿萨夫
我觉得Spring本身应该对这个问题有一个很好的答案(至少以文档的形式,或者某种重试拦截器)。唉,它没有。
处理重试的最佳方法(如果你想继续对事物进行“声明性”)可能是编写自己的拦截器实现,该实现将自动重试配置的事务次数。对于初学者,研究Spring的,它管理声明性事务的开始/回滚/提交行为。如果您使用的是休眠,请注意它如何处理休眠会话绑定/取消绑定到当前线程。TransactionInterceptor
如果您使用的是Hibernate,需要注意的事项:
session.clear()
MethodInterceptor.invoke()
MethodInvocation
我建议使用 spring 重试项目中的类,其配置如下: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"/>
但是,如果您仍然想自己实现它,那么来自spring文档的AOP示例是一个良好的开端。