5-事务处理
1.JDBC的事务处理
(1)JDBC的事务支持是由Connection提供的,Connection默认打开自动提交,即关闭事务,在这种情况下,每条SQL语句一旦执行,便会立即提交到数据库,永久生效,无法对其进行回滚操作;
(2)调用Connection的setAutoCommit()方法控制改变是否自动提交,可以选择开启事务或者关闭事务;
(3)一旦事务开启后,程序可以创建Statement对象来执行SQL语句(DML语句),但是这些语句虽然会被执行,但是SQL语句所做的修改不会生效,因为事务还没有结束,当所有SQL语句执行成功,可以调用Connection对象的commit()方法来提交事务,成功提交事务以后,这些SQL语句才会生效;如果任一SQL语句执行失败则应该使用Connection的Rollback()方法回滚事务;
(4)当Connection遇到一个未处理的SQLException异常时,系统将会非正常退出,事务也会自动回滚,但如果程序捕获了该异常,则需要在异常处理块中显式的回滚事务;
2.批量更新
(1)批量更新:多条SQL语句将作为一批操作被同时手机,并同时提交;
(2)批量更新的方式:
1)使用Statement对象的executeLargeBatch()方法;
2)使用Statement对象的executeBatch()方法;
(3)示例:
Statement stmt = conn.createStatement();
//使用Statement收集多条SQL语句
stmt.addBatch(sql1);
stmt.addBatch(sql2);
stmt.addBatch(sql3);
...
//同时执行所有的SQL语句 MySQL需要使用stmt.executeBatch();
stmt.executeLargeBatch();
(4)如果在批量更新的addBatch()中添加的是select语句,那么程序将出现错误,所以需要在批量更新时添加事务来使程序能够处理这样的事务,即把批量执行看做是同一个事务,当出现错误时,使其回滚到批量更新前的状态:
//保存当前的自动提交模式
boolean autoCommit = conn.getAutoCommit();
//关闭自动提交
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
//使用Statement同时收集多条SQL
stmt.addBatch(sql1);
stmt.addBatch(sql2);
stmt.addBatch(sql3);
...
//同时提交所有的SQL语句
stmt.execyteLargeBatch();
//提交事务
conn.commit();
//还原自动提交模式
conn.setAutoCommit(autoCommit);