spring对添加@Transactional的方法都干了什么

问题一:在个人电脑上执行下面这段代码会报错误com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure Last packet sent to the server was X ms ago,在有公网的服务器上执行却不会

    @Transactional(isolation = Isolation.REPEATABLE_READ, rollbackFor = Exception.class)
    @Override
    public void a() {
        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        User user = userMapper.selectById(1);
        System.out.println(user);
    }

问题二:下方代码在执行到1处时,记录被更新了,那么2处查询到的是新数据还是旧数据
spring对添加@Transactional的方法都干了什么_第1张图片
这样呢?
spring对添加@Transactional的方法都干了什么_第2张图片


当程序执行到含有@Transactional注解的方法时,会进入TransactionInterceptor的invoke方法
spring对添加@Transactional的方法都干了什么_第3张图片
createTransactionIfNecessary将创建事务
spring对添加@Transactional的方法都干了什么_第4张图片
debug进tm.getTransaction(txAttr)
spring对添加@Transactional的方法都干了什么_第5张图片
spring对添加@Transactional的方法都干了什么_第6张图片
con=txObject.getConnectionHolder().getConnection()是获取mysql连接,从这里就可以得到问题一的答案,在进入方法a之前获取mysql连接,然后执行一段耗时代码,最后查询数据库时由于mysql连接失效,导致CommunicationsException,而如果你有公网ip则不会出现这个问题,这是由于nat的波动所致。
spring对添加@Transactional的方法都干了什么_第7张图片
对于问题二:图1的2处查询到的是新数据,图2的2处查询到的是旧数据,这是事务的隔离级别是可重复读的原因。

你可能感兴趣的:(spring对添加@Transactional的方法都干了什么)