【问题标题】:SERIALIZABLE Transaction in JDBC remains SERIALIZABLE after the commit提交后 JDBC 中的 SERIALIZABLE 事务保持 SERIALIZABLE
【发布时间】:2015-07-25 02:41:50
【问题描述】:

我对 JDBC 和 Oracle 中的事务有疑问。我有以下代码:

con.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
con.setAutoCommit(true);
System.out.println(con.getTransactionIsolation());
con.commit();
System.out.println(con.getTransactionIsolation());

问题是两个打印都显示:8(对应于 Connection.TRANSACTION_SERIALIZABLE 属性)但我认为它必须打印 8 和 2 Connection.TRANSACTION_READ_COMMITTED 属性)。 有什么帮助吗?

【问题讨论】:

  • 提交事务不会改变隔离级别。你想完成什么?
  • 我想他想知道为什么事务隔离级别在提交(终止事务)之后不会恢复为读取提交。我想问题是,隔离级别的设置是事务级别的属性吗?显然,这是连接的属性,而不是特定的事务。这似乎与 SQL*Plus 中的工作方式不同,其中隔离级别是事务本身的一个属性。
  • 确实如此。在 SQL 开发人员中,当提交 SERIALIZABLE 事务时,新事务是 READ_COMMITED。我想知道为什么在 JDBC 中 SERILIZABLE 特性似乎是一个连接属性,而不是 SQL Developer 中的事务属性。

标签: oracle jdbc commit serializable


【解决方案1】:

您可以将 commit() 调用视为事务边界。因此,在提交之后,您将处于一个新事务中,并且您仍将处于相同的隔离级别(在这种情况下为 SERIALIZABLE)。

顺便说一句,JDBC 规范规定,当自动提交为真时调用 commit() 是非法的。这在 commit() 的 JavaDoc 中提到,如果启用了自动提交,它将引发异常: http://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html#commit--

您将使用 12.1 Oracle JDBC 驱动程序获得该行为。以前的版本没有抛出异常。

【讨论】:

  • 有意义吗?我的意思是,SERIALIZALE 是一个事务属性,但是如果我们执行提交,一个新事务就会开始,所以它必须是 READ_COMMITED。有记录的地方吗?谢谢!
  • 当新事务开始时,它再次处于 SERIALIZABLE 隔离状态,这意味着您不会看到通过其他连接提交的更改。在 Oracle 中,隔离是在会话中设置的,并且在整个会话期间保持不变,除非您明确更改它。
猜你喜欢
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 2013-05-09
  • 1970-01-01
相关资源
最近更新 更多