是否可以为仅调用DAO(数据访问对象)方法的方法启用事务?
class BusinessLayerFacade implements Facade {
//no transaction handling allowed here
public X foo() {
//do something
}
public Y changed(DomainObject myObject) {
//do something
//<-- start transaction
// calling DAO
//do something
// calling DAO
//<-- end transaction
}
//no transaction handling allowed here
public X foo() {
//do something
}
public Y changed(DomainObject myObject) {
//do something
//<-- start transaction
// calling DAO
//do something
// calling DAO
//<-- end transaction
}
允许}
中所有方法的事务导致对数据库的一些不受欢迎的提交。例如。当调用foo()时,在执行BusinessLayerFacade
时抛出Exception
,changed(DomainObject myObject)
已被提交到数据库,而不是在事务回滚时恢复更改。
有什么想法吗?
可以选择按名称过滤方法但是我们可以在那里放一些魔法;-)是否可以在第一次调用DAO方法时启动交易 myObject
并开始提交从 changed()
返回。如果可以的话,我在课堂上命名新方法时不必小心。
谢谢,Stefan
答案 0 :(得分:1)
如果抛出运行时异常,则回滚事务。如果抛出应用程序异常,则不会。您可以通过应用注释@Transactional:
来自定义它@Transactional(rollbackFor=SomeException.class, noRollbackFor=SomeOtherException.class)
这也可以使用rollback-for
元素的no-rollback-for
和tx:method
属性在XML中进行全局自定义。
阅读Spring reference documentation了解更多详情。
答案 1 :(得分:1)
您只需要方法级TX建议:
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="changed*" propagation="REQUIRES_NEW" rollback-for="Throwable"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="serviceMethods" expression="execution(* my.package.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>
</aop:config>