使用自动提交= false进行回滚时会发生什么?

问题描述 投票:1回答:2

不确定我是否理解正确,

如果我有:

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通过?

java jdbc
2个回答
2
投票

从[Connection#rollback()的Javadoc:

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

这意味着包裹交易中发生的everything将被回滚。如果该错误发生在第二次更新上,则意味着第一次更新成功,那么可能仅需要将第一个更新撤消。

您显示给我们的交易允许您的两个更新发生在[原子上],或者至少以这种方式出现在数据库中可能正在运行的所有线程上。此要求的一部分是整个事务成功或失败。如果是后一种情况,那么在无法将数据库恢复到尝试进行事务处理之前的起点的情况下,将使用回滚。


-1
投票
您提到的场景中所需的工作示例可在this位置找到。
© www.soinside.com 2019 - 2024. All rights reserved.