@Transactional注解中的connection获取

2019-09-29  本文已影响0人  南岩飞雪

问题

有人在技术交流群里问了这样一个问题:为啥在远程调用的时候,数据库连接就被占用了?

    @Transactional(rollbackFor = Exception.class)
    public void aFunction() {
        ...
        remoteService.revoke(); // 远程调用
        ...
        xxxDao.select(); // 数据库调用
        ...
        ...
    }

解释

  1. 排除 指令重排序 的情况,代码肯定是顺序执行的
  2. 加了 @Transactional注解,其实在进入这个方法的时候,就开启了事务;而事务是在connection上开启的;connection的获取和释放在切面完成
  3. 事务不要太大,在事务中执行耗时的远程调用肯定不好,会导致事务很长;我们项目中没有使用@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

上一篇 下一篇

猜你喜欢

热点阅读