JavaEE JDBC 事务
Posted IXENOS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 事务的主要内容,如果未能解决你的问题,请参考以下文章