日期:2014-05-18  浏览次数:20698 次

到底什么是事务,是针对一个业务,还是针对多个业务。
有个业务,里面有多个DAO操作,如果一个失败,整个回滚,没有问题。
也就是我对一个业务进行了事务处理

比如

 业务类A调用A里边的多个DAO操作,没问题


现在我想对多个业务进行事务配置,

比如业务A

业务B

。。。。

每个业务里都有多个DAO操作

我在统一的一个类中包含这些业务A,B....,进行事务配置,
当业务B里边的某个DAO失败,为什么A业务不回滚呢
------解决方案--------------------
事务通常用spring的分布式事务,spring通过切面来配置事务,进行统一管理这样比较方便.因为事务不支持嵌套,自己写的话还需要判断事务之前有没有开启,同时,如果service开启了,dao就无需开启,dao做测试的话,因为不经过service,所以dao要新建事务,而spring都帮你做好了这些
------解决方案--------------------
事务只负责它自己管辖的范围内的统一提交,回滚。你将A,B 都写进一个事务的话,一个失败,应该都回滚的。
------解决方案--------------------
你得确认一下你是不是把业务都写在了一个事务中(如果有必要可以把相应的源码贴上来),如果写在一个事务中了没有回滚是说不过去(看下是否有进行try catch异常),如果你要进行多事务处理,然后进行回滚可以考虑手动提交
------解决方案--------------------
引用:
你得确认一下你是不是把业务都写在了一个事务中(如果有必要可以把相应的源码贴上来),如果写在一个事务中了没有回滚是说不过去(看下是否有进行try catch异常),如果你要进行多事务处理,然后进行回滚可以考虑手动提交

你指的多事务处理是哪些情况啊?能否举个例子呢?谢谢!
------解决方案--------------------
楼主贴代码和错误出来吧,方便理解。
------解决方案--------------------
我的理解就是一个事务里面还包含其它的事务,或者说是涉及到其它的事务,可以把整个看作一个事务,但它又包含多个小事务。个人理解哈
------解决方案--------------------
引用:
Quote: 引用:

你得确认一下你是不是把业务都写在了一个事务中(如果有必要可以把相应的源码贴上来),如果写在一个事务中了没有回滚是说不过去(看下是否有进行try catch异常),如果你要进行多事务处理,然后进行回滚可以考虑手动提交



Servlet类调用TransactionWAY类的方法doExecute

doExecute方法中我调用了
业务1(里边保存数据操作)
业务2(里边更新数据操作)

针对doExecute方法进行了事务配置,结果当业务2发生错误的时候,业务1没有回滚,也就是事务没有起作用


但是,但是

如果我将业务1和业务2合并为一个业务,也就是保存和更新都写在一个业务了,并且对这个新业务的方法配置了事务,那么事务就起作用。


确切地说这个应该属于嵌套事务,我刚才说的那个应该也是这类
------解决方案--------------------
SPRING事务一直是个令人头疼的事情,估计楼主得辛苦了。帮忙顶个吧呵呵
------解决方案--------------------
事务的传播特性,如果你把事务分别加在A、B上这是两个事务;如果你想让A、B在同一个事务中,就要在调用A、B的方法上加事务,此时A、B就在同一个事务中,就可以同步提交回滚了
------解决方案--------------------
引用:
事务的传播特性,如果你把事务分别加在A、B上这是两个事务;如果你想让A、B在同一个事务中,就要在调用A、B的方法上加事务,此时A、B就在同一个事务中,就可以同步提交回滚了

赞同。
如果A、B分别加事务了,在A执行成功后,相关SQL已经提交,此时就算B失败了,也只能回滚B涉及的SQL操作,A的已经提交了的是无法回滚的。
------解决方案--------------------
原子定义问题,数据库也好,业务也好肯定都可以控制。自己写事务管理都没问题的

------解决方案--------------------
看你的需求。 都回滚还是怎么着。
------解决方案--------------------
那怀疑是不是配置的问题,导致事务没有生效。

如果A、B代码不多,LZ可以试试,将AB内容迁移到doexecute相关调用的地方,看看是否回滚。

还有一个排查,看看B有没有做什么特别的异常处理,导致事务失效。
------解决方案--------------------
都用同一个事务时可以的。
------解决方案--------------------
另外,将A、B上的事务去掉,只保留调用处的事务试试。
------解决方案--------------------
引用:
Quote: 引用:

另外,将A、B上的事务去掉,只保留调用处的事务试试。


这个已经试验过了,确实不行啊。

如果将业务A和业务B合并为一个类,并且A和B方法中对数据的操作也一同写在新类的同一方法下,事务就起作用。 能明白我说的意思吗。

刚写了个方法测试了下,没有问题啊。
事务传播propagation="REQUIRED" 
在service层A、B、C都配事务,都没有try catch异常处理;A做save操作,B做throw new RuntimeException()操作,C调用A、B,运行结果是A回滚了。
你的是不是doexecute事务配置有问题啊
------解决方案--------------------
你的MyTest 这个类是在定义的切面下的么
------解决方案-------------------