事务处理
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。在jdbc中的事务是使用connection的commit方法和rollback方法来管理的。
在jdbc中事务的默认提交时机,如下:
-
当一个连接对象被创建时,默认情况下是【自动提交事务】,每次执行一个 SQL 语句时,如果执行成功,就会向数据库自动提交,此操作不能回滚。
-
关闭数据库连接,数据就会【自动提交】。如果多个操作(多条sql语句),每个操作使用的是自己单独的连接(connection),则无法保证事务。【同一个事务】的【多个操作】必须在【同一个连接】下。
在jdbc中使用的基本步骤:
-
调用 Connection 对象的 setAutoCommit(false) 以取消自动提交事务
-
在所有的 SQL 语句都成功执行后,调用 commit()方法提交事务
-
在出现异常时,调用 rollback()方法回滚事务
-
若此时 Connection 没有被关闭,还可能被重复使用,则需要恢复其自动提交状态 setAutoCommit(true)
下面是实现代码思想:
@Override
//这是一个转账的案例
//一个人收钱,另一个人的钱就会减少,这两个动作要一起完成,
//不能一个减少了,另一个却没有增加
public int transfer(int id ,int money) {
Connection connection = null;
//预编译
PreparedStatement statement = null;
String sql = "update user set balance = balance + ? where id = ?";
try {
connection = DBUtil.getConnection();
//1.开启事务
connection.setAutoCommit(false);
//发送sql预编译请求
statement = connection.prepareStatement(sql);
//使用预编译变量
statement.setInt(1,money);
statement.setInt(2,id);
int rows = statement.executeUpdate();
//2.上面代码无误进行提交
connection.commit();
return rows;
}catch (Exception e){
e.printStackTrace();
//3.代码出现错误,进行回退
try {
connection.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
return -1;
}finally {
DBUtil.closeAll(connection,statement,resultset);
}
}