【问题标题】:How to restart transactions on deadlock/lock-timeout in Spring?如何在 Spring 中重新启动死锁/锁定超时事务?
【发布时间】:2009-11-19 12:11:38
【问题描述】:

在使用 Spring 时,在死锁或锁定超时异常时实现事务重启的最佳实践是什么(特别是 Spring 推荐的方法:声明性事务)?

谢谢,

阿萨夫

【问题讨论】:

    标签: java spring transactions annotations deadlock


    【解决方案1】:

    我觉得 Spring 本身应该对这个问题有一个很好的答案(至少以文档的形式,或者某种重试拦截器)。唉,它没有。

    可能处理重试的最佳方法(如果您想继续“声明”有关事物)是编写自己的拦截器实现,它将自动重试事务配置的次数。对于初学者,请研究 Spring 的 TransactionInterceptor,它管理声明式事务的开始/回滚/提交行为。如果您使用的是 Hibernate,请注意它如何处理 Hibernate 会话绑定/取消绑定到当前线程。

    使用 Hibernate 时需要注意的事项:

    • 您的“重试拦截器”应确保取消绑定任何预先存在的线程绑定 Hibernate 会话并重新绑定一个新会话。一旦从 Hibernate/JDBC 代码中抛出异常(例如,死锁),相应的 Hibernate 会话就会中毒,需要丢弃。 (session.clear() 是不够的。)
    • 如果您的事务服务方法使用 Hibernate 会话对象作为方法参数,请小心。重试时,当您重置 Hibernate 会话时,这些对象将被分离。如果服务方法假定它们已附加,则需要重新附加它们(例如,如果它们使用在服务方法中访问的延迟加载属性,或者如果您尝试保存它们等)。一般来说,最好是不要使用 Hibernate 对象作为事务服务方法的参数。
    • 您将实现MethodInterceptor.invoke() -- 传入此的MethodInvocation 实例可能是有状态的;在拦截器中使用它之前,您可能需要克隆它。

    【讨论】:

      【解决方案2】:

      我推荐使用spring retry project中的org.springframework.retry.interceptor.RetryOperationsInterceptor类,配置如this

      <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"/>
      

      但如果你仍然想自己实现它,example of AOP from spring documentation 是一个好的开始。

      【讨论】:

      • 感谢提及 spring-retry 项目。
      【解决方案3】:

      没有通用的答案,因为它取决于应用程序的具体情况。例如,您可能希望执行自动事务操作重启或通知用户操作失败并要求明确的重试确认等。

      在自动重启的情况下,我会使用 AOP。

      【讨论】:

        【解决方案4】:

        几年前我有同样的问题,最后写了 my own solution 作为 AOP 方面,最终在您的代码中看起来像这样:

          @RetryTransaction
          @Transactional
          public void doSomething() {
              ....
          }
        

        【讨论】:

          猜你喜欢
          • 2011-10-02
          • 1970-01-01
          • 1970-01-01
          • 2013-07-18
          • 2013-06-29
          • 2014-12-12
          • 2018-10-09
          • 2019-06-02
          • 2014-08-14
          相关资源
          最近更新 更多