Oracle JDBC中的可序列化事务在提交后仍保持可序列化状态
我对JDBC和Oracle中的事务有问题。我有以下代码:Oracle JDBC中的可序列化事务在提交后仍保持可序列化状态,oracle,jdbc,commit,serializable,Oracle,Jdbc,Commit,Serializable,我对JDBC和Oracle中的事务有问题。我有以下代码: con.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); con.setAutoCommit(true); System.out.println(con.getTransactionIsolation()); con.commit(); System.out.println(con.getTransactionIsolation()); 问题是两个打印都显示:8(
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属性)。
有什么帮助吗?您可以将commit()调用看作一个事务边界。因此,在提交之后,您将处于一个新事务中,并且仍然处于相同的隔离级别(在本例中可序列化)
顺便说一下,JDBC规范规定,当自动提交为true时调用commit()是非法的。JavaDoc for commit()中提到了这一点,如果启用了自动提交,它将引发异常:
您将使用12.1 Oracle JDBC驱动程序获得这种行为。以前的版本没有引发异常。提交事务不会改变隔离级别。你想实现什么?我想他想知道为什么事务隔离级别在提交(终止事务)后不恢复为readcommitted。我想问题是,隔离级别的设置是事务级别属性吗?显然,这是conneciton的属性,而不是特定的事务。这似乎与SQL*Plus中的情况有所不同,在SQL*Plus中,隔离级别是事务本身的一个属性。在SQL developer中,当提交可序列化事务时,新事务将被读取提交。我想知道为什么在JDBC中,SERILIZABLE特性似乎是连接属性,而不是SQL Developer中的事务属性。这有意义吗?我的意思是,SERIALIZALE是一个事务属性,但如果我们执行commit,一个新的事务就会开始,所以它必须被读取和提交。是否有任何地方对其进行记录?非常感谢。当新事务开始时,它再次处于可序列化隔离状态,这意味着您将看不到通过其他连接提交的更改。在Oracle中,隔离是在会话上设置的,在整个会话中保持不变,除非您显式更改它。