@RetryTransaction:当发现死锁时如何使其工作

5

并发事务导致我的SQL语句失败。 我尝试使用[此] dellroad-stuff1,但似乎被忽略了。 我正在使用Spring 3和Hibernate 4。

错误信息:

15:32:11,331 WARN SqlExceptionHelper:145 - SQL Error: 1213, SQLState: 40001
15:32:11,331 ERROR SqlExceptionHelper:147 - Deadlock found when trying to get lock; try restarting transaction
15:32:11,334 INFO AbstractBatchImpl:195 - HHH000010: On release of batch it still contained JDBC statements

重试交易失败的注释函数:

@Override   
@RetryTransaction   
@Transactional  
public void save(AnalyseResult analyseResult) {
    final int attempt = RetryTransactionAspect.aspectOf().getAttemptNumber();
    System.out.println("#############");
    System.out.println("Retry Transact : "+attempt);
    System.out.println("#############"); 
    analyseResultDao.save(analyseResult);
}

Beans.xml文件

<!--  An @AspectJ aspect will be interpreted as an aspect by Spring AOP and beans
      in the context will be advised accordingly -->
<aop:aspectj-autoproxy proxy-target-class="true" />

<bean id="hibernateExceptionTranslator" class="org.springframework.orm.hibernate4.HibernateExceptionTranslator"/> 

<bean class="org.dellroad.stuff.spring.RetryTransactionAspect" factory-method="aspectOf">
     <property name="persistenceExceptionTranslator" ref="hibernateExceptionTranslator"></property>
     <property name="maxRetriesDefault" value="4"></property>
     <property name="initialDelayDefault" value="25"></property>
     <property name="maximumDelayDefault" value="5000"></property>
</bean>

我重新格式化了你的代码并添加了语法高亮,以使其更易读。但问题仍然有些不清楚。请更新问题并展示包含“save”方法的类?同时,请也发布您的方面。 - kriegaex
我也遇到了类似的错误,而且我正在使用Java配置,你找到任何解决方法了吗? - Kalyan Pradhan
1个回答

0
请核对您是否满足了所有以下要求(根据Javadoc):
  • 该方法(和/或包含的类型)必须同时使用@Transactional@RetryTransaction进行注释。
  • @Transactional注释必须将传播设置为PROPAGATION_REQUIREDPROPAGATION_REQUIRES_NEW(其他传播值不涉及创建新事务)。
  • PROPAGATION_REQUIRED传播的情况下,在调用线程中不能已经打开事务(在同一事务管理器下)。换句话说,被调用的方法必须负责创建一个新事务。
  • 该方法的类必须使用AspectJ编译器(在构建时或运行时)编织,使用RetryTransactionAspect方面(包含在dellroad-stuff JAR文件中)。
  • RetryTransactionAspect方面必须配置适用于正在使用的ORM层的PersistenceExceptionTranslator。最简单的方法是在Spring应用程序上下文中包含该方面,例如:

    <bean class="org.dellroad.stuff.spring.RetryTransactionAspect" factory-method="aspectOf"
    p:persistenceExceptionTranslator-ref="myJpaDialect"/>;
    

    这还为您提供了更改maxRetries()、initialDelay()和maximumDelay()的默认值的机会,当未在注释中明确覆盖时,这些值将被应用,例如:

     <bean class="org.dellroad.stuff.spring.RetryTransactionAspect" factory-method="aspectOf" 
     p:persistenceExceptionTranslator-ref="myJpaDialect" p:maxRetriesDefault="2"
     p:initialDelayDefault="25" p:maximumDelayDefault="5000">;
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接