我有一个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配置吗?
提前感谢您的帮助和建议!
答案 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级别更改所有这些内容。这些都是基于默认行为。