问题描述
我写的一个项目,用spring管理service层事务,利用<aop:config>织入service层,然后配置tx:advice,设置tx:method标签,name="delete*","insert*","update*",满足这三种特征的service方法,能正常实现再异常时回滚。但是,我在service定义了另外一个没有带着个特征的方法,比如userRegedit(){}在这个方法里调用"insert*"方法,未使用任何try catch,从控制台上看异常被抛出,但是事务却没回滚,请问这是为什么?难道说spring只能看到最终抛出异常的方法,被调用方法是不管的?
解决方案
http://www.cnblogs.com/daxin/p/3393855.html你直接调用insertAAA 是Proxy.insertAAA() 代理对象加了事物。你是调用的BBB 那么是这样的 proxy.BBB 代理对象调用了BBB方法。然后你BBB里调用了AAA 那等于是这样的 target.aaa() 是目标对象调用的。所以事物就不起作用了
解决方案二:
需要不同的方法放到不同的类里,然后再配重开事务,这样就可以啦
解决方案三:
从问题的描述来看,问题出现在事务的传播上,可能你对事务的传播类型还不是很了解。不知道你在tx:method中怎样配置的事务传播类型。你可以使用类似下面的配置,对说有函数使用SUPPORTS类型的事务传播级别<tx:advice id="transactionAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="*" propagation="SUPPORTS" read-only="true" /> </tx:attributes></tx:advice>事务传播类型:PROPAGATION_REQUIRED: 如果存在一个事务, 则支持当前事务. 如果没有事务则开启一个新的事务.<--常用 PROPAGATION_SUPPORTS: 如果存在一个事务, 支持当前事务. 如果没有事务, 则非事务的执行.<--常用 PROPAGATION_MANDATORY: 如果已经存在一个事务, 支持当前事务. 如果没有一个活动的事务, 则抛出异常. PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务. 如果一个事务已经存在, 则将这个存在的事务挂起.<--嵌套事务 PROPAGATION_NOT_SUPPORTED: 总是非事务地执行, 并挂起任何存在的事务 PROPAGATION_NEVER: 总是非事务地执行, 如果存在一个活动事务, 则抛出异常 PROPAGATION_NESTED: 如果一个活动的事务存在, 则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行.
解决方案四:
userRegedit方法中如果使用this调用本类的方法,这个方法并不是经过spring代理对象调用,所以AOP的切入是没有的。
解决方案五:
配置和代码贴出来看看。你这么用语言描述根本不知道你错在什么地方?Spring默认不会回滚Execption 默认只回滚RunTimeException以及其子类。