不确定我是否理解正确,
如果我有:
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通过?
从[Connection#rollback()的Javadoc:
撤消在当前事务中所做的所有更改,并释放此Connection对象当前持有的所有数据库锁。仅当禁用自动提交模式时,才应使用此方法。
这意味着包裹交易中发生的everything将被回滚。如果该错误发生在第二次更新上,则意味着第一次更新成功,那么可能仅需要将第一个更新撤消。
您显示给我们的交易允许您的两个更新发生在[原子上],或者至少以这种方式出现在数据库中可能正在运行的所有线程上。此要求的一部分是整个事务成功或失败。如果是后一种情况,那么在无法将数据库恢复到尝试进行事务处理之前的起点的情况下,将使用回滚。