JDBC AutoCommit和Rollback

时间:2016-12-16 05:04:18

标签: java jdbc

我不确定我是否理解这些概念,

如果我有:

try{
  conn.setAutoCommit(false);
  Statement st= conn.createStatement();

  // valid statement
  String statement1 = ....;
  st.executeUpdate(statement1)

  // invalid statement that will cause an error
  String statement2 = ....;
  st.executeUpdate(statement2)

}catch(SQLException e){
  // there was an error
  conn.rollback();

这两个陈述都被丢弃了吗?或者它只忽略statement2并且statement1通过?

2 个答案:

答案 0 :(得分:1)

来自Connection#rollback()的Javadoc:

  

撤消当前事务中所做的所有更改,并释放此Connection对象当前持有的所有数据库锁。只有在禁用自动提交模式时才应使用此方法。

这意味着回滚包装事务中发生的所有。如果第二次更新发生错误,意味着第一次更新成功,那么可能只需要反转第一次更新。

您向我们展示的事务允许您的两个更新以原子发生,或者至少以这种方式出现在可能正在数据库中运行的所有线程中。此要求的一部分是整个事务成功或失败。如果是后一种情况,则回滚是在尝试事务之前未将数据库带回起点的情况下使用的。

答案 1 :(得分:-1)

您提及的方案中需要的工作示例位于this处。

以下是讨论此行为的Oracle documentation

autocommit()设置为false表示您作为程序员希望根据DML查询的结果控制提交事务。

要回答您的问题,如果您提到的话,INSERT语句都不会成功。

希望你得到你所寻求的信息!