我试图找出回滚的实际作用。
我有几种情况:
成功提交后回滚。
Connection conn=getConnection();
try{
executesSomeQuery(conn);
conn.commit();
} catch(Exception e){
//assume no exception
}finally{
conn.rollback();
}
提交失败后回滚。如果在同一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();
}
答案 0 :(得分:3)
顾名思义,rollback()会回滚事务,并且不会对数据库进行任何更改。
try块中的所有语句在DB上顺序执行。如果其中任何一个抛出异常,则代码不会提交更改,而是将所有更改全部还原,并使数据库保持未受影响的状态。
这有助于实现多个事务的原子性。
答案 1 :(得分:2)
提交和回滚通知数据库提交或回滚(即撤消)当前事务。在Java级别,它们实际上根本不执行任何操作。
在数据库上完成操作的方式因实际数据库实现而异。
对于您而言,如果q2失败,则q1对数据库的任何影响都将被撤消。
而且,自然地,根本不会执行q3。
答案 2 :(得分:2)
回滚的想法是,每当您在数据库中插入/更新数据时,如果有任何错误,回滚将使您免于将错误/未完成的数据插入/更新到数据库中。通过查看您的代码片段1-错误,您应该在catch中进行回滚,如果捕获到错误而不是必须进行回滚,则最后执行的是最后一次执行,因此到该数据已经提交时,就没有回滚了。>