如果在提交期间丢失了与db资源的连接,这可能导致提交失败,然后是失败的回滚,那么事务是否部分提交?这似乎发生在我的案例中,但希望社区更清楚这一点。 HibernateTransactionManager和Oracle正在与JDBC驱动程序一起使用。
答案 0 :(得分:3)
否(除非我们在讨论分布式事务,否则除非我们正在谈论分布式事务)。
如果客户端和数据库之间的连接丢失,则数据库可能从未收到提交事务的请求。在这种情况下,一旦数据库发现客户端已死(可能需要一些时间),该事务将被回滚。如果连接丢失,则数据库可能成功提交,但客户端永远不会收到提交成功的通知。
如果我们谈论的是分布式事务,则事务可能在一个(或多个)分布式节点上仍然存在疑问。如果是这种情况,则事务将显示在事务仍处于未决状态的节点上的dba_2pc_pending
中。但它不会在任何节点上部分提交。
如果我不得不猜测,如果你看到“部分提交”的东西,我会打赌问题是你的事务边界不正确,并且你有一些提交的代码(隐式)或明确地)你不期望它。
答案 1 :(得分:0)
添加答案,因为我可以找到为什么会发生部分提交。正在使用的jdbc连接池上设置了属性以删除已放弃的连接。在从池中删除此类连接时,将在此类连接上调用close(),这将导致提交当时正在使用这些连接的事务(不从应用程序角度放弃)。解决方案是拦截此类紧密调用并回滚连接或正确处理