【发布时间】:2017-02-14 21:14:21
【问题描述】:
我在创建连接后立即设置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 表示它是特定于供应商的:
如果连接在没有明确提交或回滚的情况下关闭; JDBC 在这里没有特别要求任何东西,因此行为取决于数据库供应商。如果是 Oracle,则会发出隐式提交。
这没有意义。谢谢。
【问题讨论】:
-
您通常不会只为单个语句打开连接。您保持打开状态(例如在连接池中)。如果您使用自动提交,您将如何回滚多语句事务?
-
Oracle 在其文档中对transanction 有很好的定义。但是,当您调用 close 方法时,实际发生的一切都是单个事务的形式,该事务遵循其 ACID 属性,该属性指出事务后的每个语句都必须完成,这就是它保存数据的原因。
-
请注意,如果您在没有显式提交或回滚的情况下关闭连接,其他 JDBC 驱动程序可能会回滚。