gpt4 book ai didi

java - Connection.setAutoCommit(false); 的用途是什么?什么时候用Oracle数据库?

转载 作者:搜寻专家 更新时间:2023-10-30 20:15:59 32 4
gpt4 key购买 nike

我在创建连接后立即设置 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 会提交任何待处理的事务。无论您是通过 conn.close() 使用 sqlplus 还是 JDBC 驱动程序,都会发生这种情况。请注意,发出提交的不是驱动程序,而是服务器。在注销期间,服务器提交挂起的更改。在您的 Java 程序中,如果您想确保未提交挂起的更改,您始终可以在调用 conn.close() 之前调用 conn.rollback()

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

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

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com