HikariCP如何处理不完整的JDBC交易?

昨天,我遇到了HikariCP,并花了一整夜的时间研究它。我对微调其实现和设计所投入的大量细节和精力印象深刻。直截了当地说,我无法确定它实际上如何处理那些被检查回池的连接,其设置为 ,而由于异常,它们既不发出也没有发出。对于下一个请求者来说,这可能是许多严重事务问题的根源,该请求者期望有一个新的连接,但不幸的是,它以悬空的事务状态接收到此连接。autoCommitfalsecommit()rollback()

虽然C3P0和Tomcat的JDBC池有一些所谓的旋钮(通过配置或拦截),但我在HikariCP的文档或支持组中找不到任何东西。如果我错了,请纠正我,但是写一个简单的单元测试告诉我,游泳池对此没有任何作用。

我需要知道这个观察结果是否真的正确,我没有遗漏任何东西。另外,如果有任何计划在HikariCP中解决这个问题,因为它对我来说至关重要。

谢谢。


答案 1

我是HikariCP的作者之一。如果自动提交关闭,HikariCP 不会自动执行提交或回滚。通常,显式关闭自动提交的应用程序已准备好正确处理这些操作(在块中建议) - 如官方 JDBC 文档中的示例所示。finally

如果将自动提交设置为 false 的池的连接返回到池,我们愿意向 HikariCP 添加自动“回滚”行为(但不是自动“提交”)。如果您希望此行为,请打开功能请求。

更新:HikariCP 1.2.2 及更高版本对自动提交设置为“false”的已关闭连接执行自动“回滚”。此外,它将事务隔离级别重置为配置的默认值,并且如下面的注释中所述,当然将关闭打开语句等。

更新:HikariCP 2.3.x 及更高版本现在在自动提交设置为 时额外跟踪事务状态,如果事务状态为干净,将绕过自动回滚操作。false


答案 2

推荐