【问题标题】:What happens to my JDBC transaction if I lose my session如果我失去会话,我的 JDBC 事务会发生什么
【发布时间】:2015-06-02 23:39:21
【问题描述】:

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

  • 开始会话

  • 开始交易

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

  • 提交事务

  • 结束会话

所以。 . .如果我在交易过程中丢失会话(由于网络问题或某些原因)会怎样?我会自动回滚吗?事务超时时我会回滚吗?我担心我的数据库会处于不一致的状态,直到 Oracle 开始清理。

【问题讨论】:

标签: java oracle session jdbc transactions


【解决方案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

【讨论】:

  • 关于自动提交的要点。请注意,如果您使用实现 JPA(Java Persistence API)的 ORM,例如 Hibernate 或 EclipseLink,自动提交将自动关闭,覆盖 JDBC 的默认设置。
【解决方案2】:

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

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

您还可以参考数据库开发指南,其中有描述事务保护的部分。

【讨论】:

    【解决方案3】:

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

    具体发生的情况取决于您使用的数据库系统 (DBMS) 及其配置。但是大多数 DBMS,尤其是 Oracle,都配置了超时(或多个超时)。如果超时过期,事务将被回滚。

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

    我担心我的数据库会处于不一致的状态,直到 Oracle 开始清理。

    这取决于您所说的“不一致状态”是什么意思,以及您使用的事务隔离级别。只要交易还处于打开状态,就可能会有一些副作用,比如:

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-25
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      • 2010-12-02
      相关资源
      最近更新 更多