[事物唯一性]spring AOP 事物回滚不同步使用spring声明式事物管理,配置如下:利用Aop切面管理所有业务service类,进行事物管理.但service层在调用多个dao操作时,无法完成事物同步回滚.DAO_A.save(a);DAO
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/05 23:34:59
[事物唯一性]spring AOP 事物回滚不同步使用spring声明式事物管理,配置如下:利用Aop切面管理所有业务service类,进行事物管理.但service层在调用多个dao操作时,无法完成事物同步回滚.DAO_A.save(a);DAO
[事物唯一性]spring AOP 事物回滚不同步
使用spring声明式事物管理,配置如下:
利用Aop切面管理所有业务service类,进行事物管理.
但service层在调用多个dao操作时,无法完成事物同步回滚.
DAO_A.save(a);
DAO_B.save(a);
当其中一个dao执行出错时,hinbernate不会立即抛出异常,而且等所有代码执行完毕后在抛出异常.
这时其中一个dao层的sql还会执行.不能同步回滚,不解.
利用手动回滚,可正常同步回滚事物.
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);;
/HibernateTransactionManager txManager = new HibernateTransactionManager();
TransactionStatus status = txManager.getTransaction(def);;
txManager.rollback(status);
请spring高手解释原因何在?是否配置有问题?
注:不使用TransactionProxyFactoryBean代理配置形式.
[事物唯一性]spring AOP 事物回滚不同步使用spring声明式事物管理,配置如下:利用Aop切面管理所有业务service类,进行事物管理.但service层在调用多个dao操作时,无法完成事物同步回滚.DAO_A.save(a);DAO
总结-spring事物同步回滚/提交:
1.保证事物传播机制正确配置
2.session会话管理配置
3.DataAccess层异常是否抛出,如果抛出,service也需要抛出(throw e),要么全不抛,要么全抛,直至Web层catch().
4.保证抛出的异常是否在spring aop事物管理范围内,RuntimeException异常,UncheckException异常.如自定义异常需继承运行时异常.在抛出.
5.如service层需抛出自定义异常,异常又不为运行时异常,需织入一个检查异常,spring默认只处理RuntimeException的子类和Error,自定义异常需transactionAttribute节点底下定义你自己的rollback rules才能被Spring正确管理,源码:RuleBasedTransactionAttribute.
问题解决.