如题,尝试实现了一个测试代码,在某个线程中,开启了手动事物,并且查询了数据库,但是既不提交事务,也不回滚事务。然后开启了大量线程去查询数据库,从打印的日志看,此时这些线程使用的数据库连接都不是之前开启手动事物的线程所调用的连接。
那么在何种情况下,这个连接会归还到数据库连接池中,还是会被永久的挂起?
10 回答8.3k 阅读
6 回答2.6k 阅读
4 回答2.4k 阅读✓ 已解决
8 回答3.4k 阅读
4 回答2.3k 阅读✓ 已解决
7 回答3.2k 阅读
4 回答2.4k 阅读✓ 已解决
我尝试回答一下:由于你的事务处于长时间的等待过程中,我理解你的归还连接,可以等同于事务/连接超时。
首先作为客户端,一般会设置事务超时时间,druid连接池也有连接空闲超时时间,但你既然想创造问题,必然会设置为近乎永久等待。
然后作为数据库,本身配置了一系列超时参数,例如常见的8小时问题,数据库默认等待连接8h后断开(wait_timeout)。
如果你模拟客户端始终保持读取数据状态不响应,那么就会有读超时。(但看问题是读完停下,还是会回到空闲超时)。
事务本身有超时机制,例如innodb_lock_wait_timeout。(不过这个参数对于读锁,以及不同隔离级别下的生效与否没有实验过,似乎值得试一下)。
从实际使用经验来看,维持长时间的session比断开session要难...