spring事务如何在包含3个dao方法调用的服务方法中创建

时间:2014-11-14 04:15:08

标签: java spring hibernate transactions

我有一个database.xml来定义像

这样的spring事务
<aop:config proxy-target-class="true">
        <aop:advisor advice-ref="txAdvice"
            pointcut="execution(* com.compass.utils..*.*(..))" />
</aop:config>

和我的dao,服务都在utils包或子包中 像:

com.compass.utils.db.dao
com.compass.utils.service

如果我的服务类是

    public class AlarmService {
         @autowired
         private AlarmDao alarmDao;
         @autowired
         private PositionDao positionDao;
         @autowired
         private AccountDao accountDao;
      public void testService(){
          alarmDao.save(a);
          positionDao.save(b);
          accountDao.save(c);
     }
   }

在调用testService时创建了多少个事务? 4个事务?三个事务用于save调用,一个用于testService?还是只有一个事务?

如果创建了4个事务,如果save或testService抛出异常,如何回滚? 也许positionDao.save(b)抛出异常,只是positionDao.save回滚的事务,而alarmDao保存完成或者因为testService事务而保存回滚?

如果我更改了AlarmService包路径,请使用com.compass.utils,例如 com.compass.service,关于我的问题的交易有什么影响?

当AlarmService在com.compass.service包中,并且我在testService方法中注释@Transactional时,对我的问题的交易有什么影响?

@Transactional可以@Override database.xml配置吗?

提前感谢您的帮助和建议!

1 个答案:

答案 0 :(得分:1)

  

在调用testService时创建了多少个事务? 4笔交易?三笔交易

只会创建一个TX,如果其中一个保存方法发生任何异常,TX将被回滚。

  

如果我更改了AlarmService包路径,请将其从com.compass.utils中删除,就像com.compass.service一样,对我的问题的交易有什么影响?

将创建3个TX,每个TX将单独提交或回滚。

  

当AlarmService在com.compass.service包中,并且我在testService方法中注释@Transactional时,对我的问题的交易有什么影响?

没有,因为它不在配置包中,Spring不建议这样做,所以你的注释将被忽略。这将表现得像第二个问题,并将创建3个交易。

  

@Transactional可以@Override database.xml配置吗?

是的,Spring能够同时使用XML和注释配置,并始终使用最具体的配置,在这种情况下是注释。

P.S。您可以使用不同的propagation级别更改所有这些内容。这些都是基于默认行为。