美文网首页
@Transactional注解中的connection获取

@Transactional注解中的connection获取

作者: 南岩飞雪 | 来源:发表于2019-09-29 22:49 被阅读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

    相关文章

      网友评论

          本文标题:@Transactional注解中的connection获取

          本文链接:https://www.haomeiwen.com/subject/mbddcctx.html