java - Connection.setAutoCommit(false); 有什么用?什么时候使用Oracle数据库?

标签 java database oracle jdbc

我在创建连接后立即设置con.setAutoCommit(false);,以便数据库中没有任何未提交的内容。但事实证明,如果您关闭连接,无论您的 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 (); 有什么用?

Another answer说它是特定于供应商的:

If a Connection is closed without an explicit commit or a rollback; JDBC does not mandate anything in particular here and hence the behaviour is dependent on the database vendor. In case of Oracle, an implict commit is issued.

这没有意义。谢谢。

最佳答案

注销 Oracle 会提交任何挂起的事务。无论您使用 sqlplus 还是通过 conn.close() 使用 JDBC 驱动程序,都会发生这种情况。请注意,发出提交的不是驱动程序,而是服务器。注销期间,服务器提交挂起的更改。在 Java 程序中,如果您想确保未提交的更改未提交,您始终可以在调用 conn.close() 之前调用 conn.rollback()

你问conn.commit()有什么用。它用于在业务逻辑的特定点显式提交事务。例如,如果您在连接池中缓存连接,则可以禁用自动提交并在将连接释放回池之前提交挂起的更改。有些人更喜欢启用自动提交模式(这是 JDBC 中的默认模式),而不用担心显式提交或回滚更改。这取决于你的业务逻辑。您可以问自己:我是否需要回滚 DML 执行?如果答案是肯定的,那么您应该禁用自动提交并显式提交事务。

关于java - Connection.setAutoCommit(false); 有什么用?什么时候使用Oracle数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39890677/

相关文章:

java - 使用 == 将 Long 对象类型与原始 int 进行比较

database - 这个查询可能吗?

java - 所有值均未插入数据库

java - 长整型舍入和重新格式化

java - 如何通过springboot使用post方法获取静态html页面

java - 我应该如何在本地java应用程序中实现数据库

mysql - Laravel,多对多表中具有属性的产品

c# - 并发控制Oracle与Delphi7

sql - Oracle - 像文本宏一样使用WITH子句

java - 如何在 SonarQube 中获取 MAVEN 多模块项目的代码覆盖率