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 - 练习

 

 

 

 

 

posted @ 2021-07-22 16:21  Jasper2003  阅读(41)  评论(0编辑  收藏  举报