Spring 3.0声明式事务与程序化事务

时间:2018-08-23 15:41:56

标签: spring transactions rollback

我正在使用Spring 3.0进行事务管理,效果很好。我使用一种声明性方法,该方法指向特定的程序包,并将定义的程序包中的任何@Service类标识为事务性的。以下是我的交易建议。

我的交易建议

事务通知指定以“ find *”之类的名称开头的任何方法将是只读的,所有其他方法将使用默认的事务设置,该设置将在任何运行时异常时回滚。

<tx:advice id="transactionAdvice">
    <tx:attributes>         
        <tx:method name="find*" read-only="true" />         
        <tx:method name="*" />
    </tx:attributes>
</tx:advice>

我正在处理的一种方法尤其需要微调,以在发生唯一异常时回滚。我可以使用下面的代码片段来工作...

<tx:advice id="transactionAdvice">
    <tx:attributes>         
        <tx:method name="find*" read-only="true" />
        <tx:method name="myMethod" rollback-for="MyUniqueException"/>           
        <tx:method name="*" />
    </tx:attributes>
</tx:advice>

虽然上述方法可以很好地工作,但很难在整个代码库中应用,而且由于可以处理成百上千的类,因此在维护方面我会遇到问题。我最初的想法是将程序化+声明式事务管理交织在一起,如下所示...

@Transactional
@Service("myService")
public class MyService
{
   @Transactional(rollbackFor = MyUniqueException.class)
   public void myMethod() throws MyUniqueException
   {
      //do some stuff and maybe throw a MyUniqueException
   }

}

在声明式(.xml)之上尝试上述程序化方法(annotation)时,我得到了如下所示的堆栈跟踪,并且事务也没有作用。

TRACE org.springframework.transaction.interceptor.RuleBasedTransactionAttribute - Winning rollback rule is: null
TRACE org.springframework.transaction.interceptor.RuleBasedTransactionAttribute - No relevant rollback rule found: applying default rules

似乎交易规则正在采用声明式方法中的默认规则。 Spring是否允许通过编程式交易“覆盖”声明式交易?我在这里做错了吗?

0 个答案:

没有答案