事务(transaction)
当所有语句都顺利执行后,事务可以被提交(commit)。若某个语句遇到错误,那么事务将被回滚。
将多个命令组合成事务的原因是为了确保数据库完整性(database integrity)。
默认情况下,数据库连接处于自动提交模式,一旦SQL命令被执行便被提交给数据库。一旦命令被提交,就无法对它进行回滚操作。
使用事务时,需关闭自动提交模式 conn.setAutoCommit(false);
创建一个语句对象 Statement stat = conn.createStatement();
然后任意多次地调用executeUpdate方法 stat.executeUpdate(command1);
stat.executeUpdate(command2);
执行了所有命令后,调用commit方法提交 conn.commit();
如果出现错误,调用rollback()回滚 conn.rollback();
保存点
使用保存点,可以在回滚操作时只回滚到该保存点即可,而非事务的开头。
Statement stat = conn.createStatement();//开始事务,rollback()回退到事务开头
stat.executeUpdate(command1);
Savepoint svpt = conn.setSavepoint();//设置保存点,rollback(svpt)回退到该点
stat.executeUpdate(command2);
...
conn.commit();
conn.releaseSavepoint(svpt);//当不需要保存点时,必须要释放
批量更新
一个命令序列作为一批操作同时被收集和提交。
处于同一批中的容器可以是INSERT、UPDATE和DELETE等操作,也可以是数据库定义命令,如CREATE TABLE和DROP TABLE。但是,在批量处理中添加SELECT命令会抛异常。
批量处理首先需创建Statement对象
Statement stat = conn.createStatement();
然后调用addBatch方法:
String command = "CREATE TABLE ...";
stat.addBatch(command);
while(...){
command = "INSERT INTO ... VALUES(...)";
stat.addBatch(command);
}
提交整个批量更新语句
int[] counts = stat.executeBatch();//返回一个记录数的数组
为了在批量模式下正确的处理错误,必须将批量执行的操作视为单个事务。如果批量更新失败,必须回滚到批量操作开始之前的状态。
首先,关闭自动提交模式,然后收集批量操作,执行并提交该操作,最后恢复最初自动提交模式:
boolean autoCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
Statement stat = conn.getStatement();
...
//keep calling stat.addBatch(...);
...
stat.executeBatch();
conn.commit();
conn.setAutoCommit(autoCommit);