实际回滚是什么?

时间:2019-01-29 21:15:09

标签: java database jdbc

我试图找出回滚的实际作用。

我有几种情况:

  1. 成功提交后回滚。

    Connection conn=getConnection();
    try{
       executesSomeQuery(conn);
       conn.commit();
    } catch(Exception e){
       //assume no exception
    }finally{
       conn.rollback();
    }
    
  2. 提交失败后回滚。如果在同一commit()中按顺序提交三个查询q1,q2,q3,则如果q2失败,对q1会发生什么?以及conn.rollback()如何提供帮助?无需conn.commit()就能rollback()回滚吗?

    Connection conn=getConnection();
    try{
       executesSomeQuery(conn); // has three queries in order; q1, q2, q3. q2 fails and causes error
       conn.commit();
    } catch(Exception e){
       //assume exception is thrown because commit failed due to q2
       conn.rollback();
    }
    

3 个答案:

答案 0 :(得分:3)

顾名思义,rollback()会回滚事务,并且不会对数据库进行任何更改。

try块中的所有语句在DB上顺序执行。如果其中任何一个抛出异常,则代码不会提交更改,而是将所有更改全部还原,并使数据库保持未受影响的状态。

这有助于实现多个事务的原子性。

答案 1 :(得分:2)

提交和回滚通知数据库提交或回滚(即撤消)当前事务。在Java级别,它们实际上根本不执行任何操作。

在数据库上完成操作的方式因实际数据库实现而异。

对于您而言,如果q2失败,则q1对数据库的任何影响都将被撤消。

而且,自然地,根本不会执行q3。

答案 2 :(得分:2)

回滚的想法是,每当您在数据库中插入/更新数据时,如果有任何错误,回滚将使您免于将错误/未完成的数据插入/更新到数据库中。通过查看您的代码片段1-错误,您应该在catch中进行回滚,如果捕获到错误而不是必须进行回滚,则最后执行的是最后一次执行,因此到该数据已经提交时,就没有回滚了。