spring 数据源是怎么知道什么时候应该释放或者归还连接的

问题描述

当使用 spring 数据源连接的时候, 被告知 @Transaction 实现原理是因为使用的同一个连接, 那连接打开总得释放或者归还连接池吧.

但是如果在方法结束时关闭连接, 这只是一个被调用方法, 后面就得打开一个新连接了, 那就不同一个事务

当前方法不可能知道这个事务是否已经结束了, 是否还有调用者也加了 @Transaction 注解,

当然, 获取连接是第一个 @Transaction 或者之前就已经获取到连接了 , 将当前连接绑定到当前线程, 那是什么时候来关闭呢

是哪个地方获取的连接, 就由哪个方法执行结束来关闭吗

问题出现的环境背景及自己尝试过哪些方法

尝试过了看源码 , 找必应查询了大量资料

阅读 3.3k
2 个回答

DefaultTransactionStatus.newTransaction,这个字段决定了当前这个方法是否需要提交事务(基本上我们的应用场景,第一个加事务注解的方法,此方法需要加获取连接,提交事务,此时他就是true)
image.png
这是已存在事务的处理,明显看到这个字段是false
image.png
image.png

对于aop来说,它则是不管你是什么情况,都会走到事务提交的方案里面,
image.png
这里就会判断你是不是新事务,是才会给你提交事务
image.png
然后是释放连接,释放的话,相对特殊点,它是通过注册的TransactionSynchronization去触发释放连接的操作,
image.png
这里也能反驳你说你不知道当前方法不知道这个事务是否已经结束,你既然知道一个事务复用connect,如果我没有connect,是不是在一定程度上,我可以判断,当前事务已结束

c> 是哪个地方获取的连接, 就由哪个方法执行结束来关闭吗

是的,@Transaction事务切面就是在方法开始前拿连接开始事务,方法执行完提交事务释放连接

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题