首页 > 代码库 > JavaEE JDBC 事务

JavaEE JDBC 事务

JDBC 事务

@author ixenos

 

 

 

事务


 

1.概念:我们将一组语句构建成一个事务(trans action),当所有语句顺利执行之后,事务可以被提交(commit);否则,如果其中某个语句遇到错误,那么事务将被回滚,就好像没有任何语句被执行一样

2.需求背景:将多个语句组合成事务的主要原因是为了确保数据库完整性(database integrity)

 

3.默认情况下,数据库连接处于自动提交模式(autocommit mode),每个SQL语句一旦被执行便被提交给数据库,一旦命令被提交就无法对它进行回滚操作;

  而我们在使用事务时,就要关掉这个默认值:

conn.setAutoCommit(false);

//以下是一般的执行流程
Statement stmt = conn.createStatement();
//任意多次调用executeUpdate方法
stmt.executeUpdate(command1);
stmt.executeUpdate(command2);
stmt.executeUpdate(command3);
....

//如果没有捕获异常而走到了这一步,那么调用commit方法
conn.commit();

//捕获到了异常,则调用rollback,自动撤销上次提交以来的所有语句
conn.rollback();

 

 

保存点(save point)


 

1.使用保存点可以更细粒度地控制回滚(rollback)操作

2.创建一个保存点意味着只需返回到这个点,而非事务的开头

conn.setAutoCommit(false);
//事务开始
Statement stmt = conn.createStatement();
stmt.executeUpdate(command1);

//创建保存点
Savepoint spoint = conn.setSavepoint();

stmt.executeUpdate(command2);

if(.....){
    conn.rollback(spoint); //撤销command2的影响
}

...
conn.commit();

3.当不需要保存点时,释放它

conn.releaseSavepoint(spoint);

 

 

批量更新(batch update)


 

1.需求背景:一个程序需要执行许多INSERT语句,以便将数据填入数据库表中,此时可以使用批量更新的方法来提高性能

2.注意:

(1)处于同一批中的语句可以使INSERT、UPDATE和DELETE操作,也可以是数据库定义的语句,如CREATE TABLE和DROP TABLE

(2)但是在批量处理中添加SELECT语句将抛出异常! 因为批量处理SELECT语句是没有意义的,因为只是返回结果集,而不会更新数据库!

3.示例:

Statement stmt = conn.createStatement();

//此时调用addBatch冯方法,而非executeUpdate方法
String command = "CREATE TABLE ...";
stmt.addBatch(command);

while(...){
    command = "INSERT INTO ... VALUES(" + ... + ")";
    stmt.addBatch(command);
}

//最后提交整个批量更新语句
int[] counts = stmt.executeBatch();

  

 

事务mix批量更新


 

  为了在批量模式下正确识别错误,必须将批量执行的操作视为单个事务(原子性),如果批量更新在执行过程中失败,那么必须将它会滚到批量操作开始之前的状态。

  首先,关闭自动提交模式,然后收集批量操作,执行并提交该操作,最后恢复到最初的自动提交模式:

//备份原来提交模式的参数
boolean autoCommit = conn.getAutoCommit();

//设置手动提交事务,将批量更新视为一个事务
conn.setAutoCommit(false);

//执行一系列 stmt.addBatch(...); 操作
Statement stmt = conn.getStatement();
...
stmt.addBatch(...)
...

//先批量更新,成为一个批量更新事务
stmt.executeBatch();

//确定提交 批量更新 事务
conn.commit();

//还原原来的提交模式的参数
conn.setAutoCommit(autoCommit);

  

 

JavaEE JDBC 事务