问题
有人在技术交流群里问了这样一个问题:为啥在远程调用的时候,数据库连接就被占用了?
@Transactional(rollbackFor = Exception.class)
public void aFunction() {
...
remoteService.revoke(); // 远程调用
...
xxxDao.select(); // 数据库调用
...
...
}
解释
- 排除 指令重排序 的情况,代码肯定是顺序执行的
- 加了
@Transactional
注解,其实在进入这个方法的时候,就开启了事务;而事务是在connection上开启的;connection的获取和释放在切面完成 - 事务不要太大,在事务中执行耗时的远程调用肯定不好,会导致事务很长;我们项目中没有使用
@Transactional
,直接使用的@Resource private TransactionTemplate transactionTemplate;
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
xxxDAO.delete(...);
sssDAO.batchInsert(...);
}
});
@Transactional实现源码
待学习补充
org.springframework.transaction.interceptor.TransactionInterceptor#invoke
网友评论