数据库——事务、保存点、批量更新

事务(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);

原文地址:https://www.cnblogs.com/it-mh/p/11205533.html