我正在使用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是否允许通过编程式交易“覆盖”声明式交易?我在这里做错了吗?