一个SSH2的项目里面
假设一个Action如
TestAtion
他里面有两个Manager
如
[code="java"]
public class TestAction extends ActionSupport implements xxxxx{
private AaaaManager aManager;
private BbbbManager bManager;
[/code]
然后TestAction的一个方法里面
[code="java"]
public String save() {
aManager.saveaaa();//保存
。。。。。。。。。。
bbbbManager.savebbb() //假设这个是保存文件,如果这里出错了,这个就保存不了了,但是saveaaa却保存了了,这样事务就不一至了,请问大家这个怎么办啊。
}
[/code]
Spring的事务配置
[code="xml"]
<aop:config proxy-target-class="true">
<aop:advisor pointcut="execution(* com.xxxx.xxxxxManager.*Manager.aaa.*Manager.*(..))" advice-ref="txAdvice"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="paged*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
[/code]
还有read-only="true"表示前面那个配的方法没有事务么
[b]问题补充:[/b]
我说是我保存两个对象的时候事务不一致
aManager.saveaaa();这个保存成功了
接下来再保存一个对象
bbbbManager.savebbb() 这个没有保存成功,出了异常,而roolback了,
但是前面的saveaaa()却保存成功了。。
[b]问题补充:[/b]
如果对这三个方法都设了事务呢?
最后怎么rollback啊
[b]问题补充:[/b]
我savebbb()保存不成功是因为程序的问题,因为SPRING里面事务在Manager里面,所以每个SAVE都是一个事务,所以事务不一致
看你定义的切面
你是对Manager后缀的service进行管理事务。
aManager.saveaaa();//这个是一个单独的事务
。。。。。。。。。。
bbbbManager.savebbb()//这个又是一个单独的事务
所以,这两个事务是不相关的,
自然出现了你这种情况
你应该是对
public String save() {
aManager.saveaaa();//保存
。。。。。。。。。。
bbbbManager.savebbb() //假设这个是保存文件,如果这里出错了,这个就保存不了了,但是saveaaa却保存了了,这样事务就不一至了,请问大家这个怎么办啊。
}这个方法进行事务管理,那就没问题了
read-only="true"表示前面那个配的方法的事务为[color=red]只读事务[/color]
还是有事务啊
这就要看事务的传播策略了,
建议你先好好去看看spring的事务相关
详解spring事务属性
http://www.iteye.com/topic/78674
事务传播策略似乎是嵌套调用的时候用的,楼主这么调用应该是每个方法一个单独事务,
把saveaaaa删掉,只执行savebbbb能成功吗,如果不能的话,是savebbb本身写的有问题吧
期待答案,如果和我猜想的不一样的话,等解决了之后希望楼主能把解决方法通过站内短信发给我一下