Oracle 关闭连接上的JDBC事务回滚失败

Oracle 关闭连接上的JDBC事务回滚失败,oracle,hibernate,jdbc,transactions,Oracle,Hibernate,Jdbc,Transactions,如果在提交过程中与db资源的连接丢失(这可能导致提交失败,然后是回滚失败),是否可能部分提交事务?这似乎发生在我的案例中,但我希望社区对此有更好的澄清。HibernateTransactionManager和Oracle正在与JDBC驱动程序一起使用。否(除非Oracle中存在严重错误或我们讨论的是分布式事务) 如果客户端和数据库之间的连接丢失,则数据库可能从未收到提交事务的请求。在这种情况下,一旦数据库发现客户机已死亡(这可能需要一些时间),事务将回滚。如果连接丢失,则可能是数据库成功提交,但

如果在提交过程中与db资源的连接丢失(这可能导致提交失败,然后是回滚失败),是否可能部分提交事务?这似乎发生在我的案例中,但我希望社区对此有更好的澄清。HibernateTransactionManager和Oracle正在与JDBC驱动程序一起使用。

否(除非Oracle中存在严重错误或我们讨论的是分布式事务)

如果客户端和数据库之间的连接丢失,则数据库可能从未收到提交事务的请求。在这种情况下,一旦数据库发现客户机已死亡(这可能需要一些时间),事务将回滚。如果连接丢失,则可能是数据库成功提交,但客户端从未收到提交成功的通知

如果我们讨论的是分布式事务,那么该事务可能在一个(或多个)分布式节点上仍然存在疑问。如果是这种情况,事务将出现在仍挂起事务的节点上。但它不会在任何节点上部分提交


如果我不得不猜测,如果您看到的是“部分提交”的内容,我敢打赌问题在于您的事务边界不正确,并且您有一些代码(隐式或显式)提交到了您不期望的地方。

添加了一个答案,因为我可以找到部分提交发生的原因。正在使用的jdbc连接池上设置了属性以删除放弃的连接。从池中删除这些连接时,将对这些连接调用close(),这将导致提交当时正在使用这些连接的事务(从应用程序的角度来看不是放弃)。一个解决方案是拦截如此接近的呼叫并回滚连接或适当地处理

我想我已经找到了答案,并且认为部分提交是可能的。Oracle在connection.close上发出隐式提交,因此在连接关闭之前的任何挂起提交都将提交事务的挂起任务,这些任务在连接关闭时无法处理(由于db连接失败)将被忽略。@user2599052-如果您显式地从代码中调用
connection.close
,这意味着与数据库的连接没有丢失——显然,您仍然可以调用
close
方法。如果您的代码在仍有其他步骤本应属于事务的一部分时显式关闭连接,这不是“部分提交”,这是应用程序中的一个错误,导致您的事务边界不正确。我指的是与数据库的连接丢失的情况(不是由于应用程序代码)在提交期间。现在您认为“部分提交”吗是可能的。@user2599052-否。如果与数据库的连接丢失,则调用
连接时客户端将发出
提交
。关闭
,这一事实与此无关。在传输提交事务请求时,将没有与数据库的连接。我同意“贾斯廷洞穴”,但也要考虑到当执行DDL时,Oracle隐式地提交事务。因此,如果在事务中执行DDL,也要考虑这一事实。