如果我丢失会话,我的JDBC事务会发生什么

时间:2015-06-02 23:39:21

标签: java oracle session jdbc transactions

我从Java程序连接到Oracle,并执行以下操作:

  • 开始会话

  • 启动交易

  • 插入一堆行,调用存储过程等

  • 提交交易

  • 结束会议

所以。 。 。如果我在交易过程中丢失会话(由于网络问题或某些原因)会发生什么?我是否获得自动回滚功能?交易超时后我会回滚吗?我担心在Oracle开始清理之前我的数据库将处于不一致的状态。

3 个答案:

答案 0 :(得分:1)

如果您的会话在执行事务期间丢失,Oracle数据库将自动回滚您的更改。您可以在文档中阅读有关Statement level atomicity的更多信息。如果由于网络问题导致交易丢失,通常会获得ORA-03113: end-of-file on communication channel,并且您的交易已在数据库中回滚。

但是,只有当您的会话在数据库服务器本身丢失时才会出现这种情况。特别是对于分布式事务(XA),当JDBC会话消失时,数据库事务通常会保持活动状态,因此在进行XA事务时请注意这一点。

还要注意自动提交,默认情况下在JDBC驱动程序中打开。这会自动提交您执行的每个操作,因此如果您有一个较长的事务,例如10个插入并且您的第9个插入失败,则插入1 - 8已自动提交并且不再被回滚。可以通过Connection.setAutoCommit(false);关闭自动提交,请参阅setAutoCommit in the JDBC API documentation

答案 1 :(得分:1)

除了所有相关的其他回复之外,我想补充一点,如果在提交过程中丢失了与数据库的连接,您将收到一个异常,它不会告诉您提交是否是成功与否。要知道事务是否已提交,您可以依赖事务保护,这是12c中的新功能。

有一个博客解释它的工作原理: https://blogs.oracle.com/dev2dev/entry/write_recovery_code_with_transaction

您还可以参考“数据库开发指南”,其中有一节介绍了Transaction Guard。

答案 2 :(得分:0)

  

如果我丢失了会话(由于网络问题或   有点)在交易中间?

究竟发生了什么取决于您使用的数据库系统(DBMS)及其配置。但是大多数DBMS,特别是Oracle,都配置了超时(或多个超时)。如果超时到期,则将回滚事务。

特别是对于Oracle,DBA可以列出Oracle服务器上的开放会话,甚至可以在超时到期之前强制终止会话。结果将是相同的:终止会话中的任何待处理事务都将被回滚。

  

我担心在Oracle开始清理之前我的数据库将处于不一致的状态。

这取决于您所说的"不一致状态"以及您使用的事务隔离级别。只要交易仍然开放,可能会有一些副作用,例如:

  • 其他人看到部分更改的数据(取决于隔离级别)
  • 行/表被锁定

一旦事务回滚,就好像它从未发生过一样。毕竟,这是使用交易的目的:-)。 如果您担心自己的交易可能会持续太久,您可能需要调整相关的超时时间。