这里是我执行事务的方法
public static boolean executeTransaction(String[] sqlArray) {
Connection conn = null;
Statement stmt = null;
boolean flag = false;
try {
conn = DBUtil.getInstance().getConn();
conn.setAutoCommit(false);
stmt = conn.createStatement();
for (String str : sqlArray) {
stmt.addBatch(str);
}
stmt.executeBatch();
flag = true;
conn.commit();
} catch (Exception e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
DBUtil.tryClose(null, stmt, conn);
}
return flag;
}
如果在执行stmt.executeBatch();到一半的时候突然发生断电之类的意外情况,那我的事务会不会回滚,还是说数组前几条SQL语句会执行。求解释

解决方案 »

  1.   

    会,这个是肯定的
    你完全可以模拟这种场景的
    断点设置在flag = true;,执行到断点是强制关闭程序,看下效果就知道了
      

  2.   

    没有进行commit,之前的一切DML应该都会回滚的。
      

  3.   

    这是dbms的责任,这种状况下重新启动数据库服务器会使用redo日志使数据库恢复断电前的状态,然后未commit的事务执行undo~
      

  4.   

    你可以把数据写成批量处理,只要数据没有全部写到数据库就不要COMMIT。