JDBC 事务操作
如果JDBC连接处于自动提交模式,默认情况下,则每个SQL语句在完成后都会提交到数据库;
对于简单的应用程序可能没有问题,但是有三个原因需要考虑是否关闭自动提交并管理自己的事务 -
- 提高性能
- 保持业务流程的完整性
- 使用分布式事务
事务能够控制何时更改提交并应用于数据库。 它将单个SQL语句或一组SQL语句视为一个逻辑单元,如果任何语句失败,整个事务将失败;
要启用手动事务支持,而不是使用JDBC驱动程序默认使用的自动提交模式,请调用Connection对象的setAutoCommit()方法。以下代码块可以关闭JDBC的自动提交事务;
connection.setAutoCommit(false)
提交和回滚
完成数据库的更改操作后,如果要提交更改,可以调用Connection的commit()方法;
connection.commit();
否则,可以使用Connection的rollback()方法进行回滚,一般在工程中,会在捕获到SQLException时进行回滚;
connection.rollback();
示例:
try{
connection.setAutoCommit(false);
Statement stmt = connection.crateStatement();
stmt.executeUpdate("insert into books(author,title,price) value (someone,Java Programmer,12.3)");
stmt.executeUpdate("insert into books(author,title,price) value (someone2,C++ Programmer,10.3)");
connection.commit();
}catch(SQLException ex){
connection.rollback();
}
使用保存点
JDBC 3.0新添加了Savepoint接口提供了额外的事务控制能力,大多数现代DBMS支持其环境中的保存点,如Oracle的PL/SQL;
设置保存点(Savepoint)时,可以在事务中定义逻辑回滚点。 如果通过保存点(Savepoint)发生错误时,则可以使用回滚方法来撤消所有更改或仅保存保存点之后所做的更改;
Connection对象中对于管理保存点,有以下的API:
SavePoint setSavepoint(String savepointName)
|
定义新的保存点
|
void releaseSavepoint(Savepoint savepointName)
|
删除保存点
|
try{
connection.setAutoCommit(false);
Statement stmt = connection.crateStatement();
SavePoint savePoint1 = connection.setSavePoint("SavePoint1");
stmt.executeUpdate("insert into books(author,title,price) value (someone,Java Programmer,12.3)");
stmt.executeUpdate("insert into books(author,title,price) value (someone2,C++ Programmer,10.3)");
connection.commit();
}catch(SQLException ex){
connection.rollback(savePoint1);
}