日期:2014-05-20  浏览次数:20967 次

如果一个事务执行到一半断电了
这里是我执行事务的方法
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语句会执行。求解释。。。

------解决方案--------------------
会,这个是肯定的
你完全可以模拟这种场景的
断点设置在flag = true;,执行到断点是强制关闭程序,看下效果就知道了
------解决方案--------------------
分两种情况吧:
1、数据库服务器掉电了,数据库日志回记录状态,恢复时回滚(和数据库设置有关系)
2、数据库服务器没掉电,只是应用服务器掉电,不影响。(指令已经发送到数据库服务器了)
------解决方案--------------------
没有进行commit,之前的一切DML应该都会回滚的。