事务使指一组最小逻辑操作单元,里面有多个操作组成。 组成事务的每一部分必须要同时提交成功,如果有一个操作失败,整个操作就回滚。
默认事务是自动提交的,一条语句开启一个事务,当运行两条语句出错后无法回滚。
/**
* 关闭自动提交事务,改为手动提交回滚
*/
@Test
public void test2() {
try {
con = JDBCUtil.getConnection();
con.setAutoCommit(false); // 设置事务为手动提交
String sql_1 = "UPDATE account SET money=money-1000 WHERE id=1;";
pstmt = con.prepareStatement(sql_1);
pstmt.executeUpdate();
String sql_2 = "UPDATE account SET mone1y=money+1000 WHERE id=2;";// 错误sql
pstmt = con.prepareStatement(sql_2); // 出错出现异常
pstmt.executeUpdate();
} catch (Exception e) {
try {
// 回滚操作,默认回滚整个事务
con.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}finally{
try {
// 提交操作
con.commit();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
JDBCUtil.close(con, pstmt);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
回滚到指定位置,需要在指定位置设置保存点
sp = con.setSavepoint();
然后回滚时,回滚到指定位置
con.rollback(sp);