JDBC: JDBC 控制事务
之前我们是使用 MySQL 的命令来操作事务。接下来我们使用 JDBC 来操作银行转账的事务。
1 数据准备
-- 创建账户表 CREATE TABLE account( -- 主键 id INT PRIMARY KEY AUTO_INCREMENT, -- 姓名 NAME VARCHAR(10), -- 转账金额 money DOUBLE ); -- 添加两个用户 INSERT INTO account (NAME, money) VALUES ('tom', 1000), ('jack', 1000);
2 事务相关API
我们使用 Connection中的方法实现事务管理
方法 |
说明 |
void setAutoCommit(boolean autoCommit) |
参数是true或 false,如果设置为false, 表示关闭自动提交,相当于开启事务 |
void commit() |
提交事务 |
void rollback() | 回滚事务 |
3 开发步骤
1. 获取连接
2. 开启事务
3. 获取到 PreparedStatement , 执行两次更新操作
4. 正常情况下提交事务
5. 出现异常回滚事务
6. 最后关闭资源
4 代码示例
public class JDBCTransaction { //JDBC 操作事务 public static void main(String[] args) { Connection con = null; PreparedStatement ps = null; try { //1. 获取连接 con = JDBCUtils.getConnection(); //2. 开启事务 con.setAutoCommit(false); //3. 获取到 PreparedStatement 执行两次更新操作 //3.1 tom 账户 -500 ps = con.prepareStatement("update account set money = money - ? where name = ? "); ps.setDouble(1,500.0); ps.setString(2,"tom"); ps.executeUpdate(); //模拟tom转账后 出现异常 System.out.println(1 / 0); //3.2 jack 账户 +500 ps = con.prepareStatement("update account set money = money + ? where name = ? "); ps.setDouble(1,500.0); ps.setString(2,"jack");
ps.executeUpdate(); //4. 正常情况下提交事务 con.commit(); System.out.println("转账成功!"); } catch (SQLException e) { e.printStackTrace(); try { //5. 出现异常回滚事务 con.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } } finally { //6. 最后关闭资源 JDBCUtils.close(con,ps); } } }
5 JDBC - 练习