Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Connection.setAutoCommit的用途是什么(false);何时使用Oracle数据库?_Java_Database_Oracle_Jdbc - Fatal编程技术网

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驱动程序可能会回滚回滚,谢谢!我需要这个答案。我用其他标签打开了那个文档,但我没有读它。博士,首先,吸取教训。