spring 数据源是怎么知道什么时候应该释放或者归还连接的
问题描述
当使用 spring 数据源连接的时候, 被告知 @Transaction 实现原理是因为使用的同一个连接, 那连接打开总得释放或者归还连接池吧.
但是如果在方法结束时关闭连接, 这只是一个被调用方法, 后面就得打开一个新连接了, 那就不同一个事务
当前方法不可能知道这个事务是否已经结束了, 是否还有调用者也加了 @Transaction 注解,
当然, 获取连接是第一个 @Transaction 或者之前就已经获取到连接了 , 将当前连接绑定到当前线程, 那是什么时候来关闭呢
是哪个地方获取的连接, 就由哪个方法执行结束来关闭吗
问题出现的环境背景及自己尝试过哪些方法
尝试过了看源码 , 找必应查询了大量资料
回答:
DefaultTransactionStatus.newTransaction,这个字段决定了当前这个方法是否需要提交事务(基本上我们的应用场景,第一个加事务注解的方法,此方法需要加获取连接,提交事务,此时他就是true)
这是已存在事务的处理,明显看到这个字段是false
对于aop来说,它则是不管你是什么情况,都会走到事务提交的方案里面,
这里就会判断你是不是新事务,是才会给你提交事务
然后是释放连接,释放的话,相对特殊点,它是通过注册的TransactionSynchronization去触发释放连接的操作,
这里也能反驳你说你不知道当前方法不知道这个事务是否已经结束,你既然知道一个事务复用connect,如果我没有connect,是不是在一定程度上,我可以判断,当前事务已结束
回答:
c> 是哪个地方获取的连接, 就由哪个方法执行结束来关闭吗
是的,@Transaction
事务切面就是在方法开始前拿连接开始事务,方法执行完提交事务释放连接
以上是 spring 数据源是怎么知道什么时候应该释放或者归还连接的 的全部内容, 来源链接: utcz.com/p/944271.html