Java Connection.setAutoCommit的用途是什么(false);何时使用Oracle数据库?
我正在设置Java Connection.setAutoCommit的用途是什么(false);何时使用Oracle数据库?,java,database,oracle,jdbc,Java,Database,Oracle,Jdbc,我正在设置con.setAutoCommit(false)只要我创建了连接,以便DB中没有未提交的内容。但事实证明,如果关闭连接,所有事务都将提交,无论setAutoCommit()状态如何 Class.forName("oracle.jdbc.driver.OracleDriver"); con = DriverManager.getConnection("jdbc:oracle:thin:@192.168.7.5:xxxx:xxx", "xxx", "xxx");
con.setAutoCommit(false)代码>只要我创建了连接,以便DB中没有未提交的内容。但事实证明,如果关闭连接,所有事务都将提交,无论setAutoCommit()状态如何
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection("jdbc:oracle:thin:@192.168.7.5:xxxx:xxx", "xxx", "xxx");
con.setAutoCommit(false);
st = con.createStatement();
String sql = "INSERT INTO emp (eid, name, dob, address) VALUES (?, ?, ?, ?)";
PreparedStatement statement = con.prepareStatement(sql);
statement.setInt(1, 8 );
statement.setString(2, "kkk" );
statement.setDate(3, date );
statement.setString(4, "pppp" );
pst = con.prepareStatement(sql);
int rowsInserted = statement.executeUpdate();
//con.commit ();
System.out.println ("rowsInserted "+rowsInserted);
con.close ();
即使在注释con.commit()之后代码>行是在连接关闭时插入的,所以我想知道con.commit()有什么用代码>
表示它是特定于供应商的:
如果连接在没有显式提交或回滚的情况下关闭;JDBC在这里没有特别规定任何内容,因此行为取决于数据库供应商。对于Oracle,将发出隐式提交
它没有意义。谢谢。con.commit()
是一种显式提交,您可以在需要提交事务时调用它。在您的情况下,虽然您已将AutoCommit
设置为false
,但没有显式提交或回滚。Oracle数据库提交会话的所有事务,该会话正常退出连接。如果会话异常终止,则回滚事务 提供了一个非常好的解释,说明了何时以及为什么应该使用此选项。请通过同样的程序
如果您的JDBC连接在语法上或默认情况下处于自动提交模式(这是默认情况,仅供参考),那么每个SQL语句在完成后都会提交到数据库
有关同一主题的更多详细说明,请参阅问题。注销Oracle会提交任何挂起的事务。无论您是通过conn.close()
使用sqlplus还是JDBC驱动程序,都会发生这种情况。请注意,发出提交的不是驱动程序,而是服务器。在注销期间,服务器提交挂起的更改。如果要确保未提交挂起的更改,可以在Java程序中调用conn.rollback()
,然后再调用conn.close()
您询问了conn.commit()
的用途。它用于在业务逻辑的特定点显式提交事务。例如,如果在连接池中缓存连接,则可以在将连接释放回连接池之前禁用自动提交和提交挂起的更改。有些人更喜欢启用自动提交模式(这是JDBC中的默认模式),而不必担心显式提交或回滚更改。这取决于您的业务逻辑。您可以问自己:我是否需要回滚DML执行?如果答案是“是”,则应禁用自动提交和显式提交事务。通常不会仅为一条语句打开连接。您可以将其保持打开状态(例如,在连接池中)。如果您使用自动提交,您将如何回滚多语句事务?Oracle在其文档中有很好的定义。但是,当您调用close方法时,实际发生的情况是,一切都是以单个事务的形式进行的,该事务遵循其ACID属性,该属性声明事务后的每个语句都必须完成,这就是它保存数据的原因。请注意,如果您在没有显式提交或修改的情况下关闭连接,则其他JDBC驱动程序可能会回滚回滚,谢谢!我需要这个答案。我用其他标签打开了那个文档,但我没有读它。博士,首先,吸取教训。