1:同一个类,如下图,我们调 service.methodA(),这时的话 methodA和 methodB都在 A定义的 事务内,只有在methodA 的方法里throws RuntimeException 时 才会回滚,methodA和methodB都会回滚。(注意:如果methodB抛出RuntimeException,但是methodA中把这种异常捕获,并让程序正常运行,则都不会发生回滚。)
-
- Service {
-
- @Transactional
- void methodA() {
- methodB();
- }
- void methodB(){
- }
- }
-
2:如下图,我们调 service.methodA(), methodB上面的事务是不生效(其他的几个注解也不会生效)。可以简单的这么理解:spring 无法找到methodB 这个切面,无法收到事务通知。具体解释见下面的博客:http://blog.csdn.net/seelye/article/details/40144817
-
- Service {
-
- void methodA() {
- methodB();
- }
- @Transactional
- void methodB(){
- }
- }
-
3:正常的话,我们两个方法都定义事务的话,就要把这两个方法放在不同的service里面。如下面:
可以把方法B放到另外一个service或者dao,然后把这个server或者dao通过@Autowired注入到方法A的bean里面,这样即使方法A没用事务,方法B也可以执行自己的事务了。AOP就是这么玩的!
- ServiceA {
- void methodA() {
- ServiceB.methodB();
- }
- }
- ServiceB {
- void methodB() {
- }
- }
4:
Spring中事务的定义:
Propagation
(key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。)有以下选项可供使用:
PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。