MySQL 基础16 JBDC 事物

1.1 事务的概念

  事务指的是逻辑上的一组操作,组成这组操作各个逻辑单元要么全都成功,要么全都失败。

1.1.1 事务环境准备

  • 创建数据库和表
create database web_test4;
use web_test4;
create table account(
    id int primary key auto_increment,
    name varchar(20),
    money double
);
insert into account values (null,'aaa',10000);
insert into account values (null,'bbb',10000);
insert into account values (null,'ccc',10000);

1.2 JDBC的事务管理


@Test
    /**
     * 完成转账的案例
     */
    public void demo1(){
        Connection conn = null;
        PreparedStatement pstmt  = null;
        try{
            /**
             * 完成转账代码:
             * * 扣除某个账号的钱
             * * 给另外一个账号加钱
             */
            // 获得连接:
            conn = JDBCUtils.getConnection();
            // 编写SQL语句:
            String sql = "update account set money = money + ? where name = ?";
            // 预编译SQL:
            pstmt = conn.prepareStatement(sql);
            // 设置参数:
            // 用aaa账号给bbb账号转1000元
            pstmt.setDouble(1, -1000);
            pstmt.setString(2, "aaa");
            // 执行SQL:扣除aaa账号1000元
            pstmt.executeUpdate();
            
//          int i = 1 / 0;
            
            // 给bbb账号加1000
            pstmt.setDouble(1, 1000);
            pstmt.setString(2, "bbb");
            pstmt.executeUpdate();
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JDBCUtils.release(pstmt, conn);
        }
    }

  在转账中没有添加事务的管理,出现aaa账号的钱被转丢了,但是bbb账号的钱没有任何变化。需要给转账的功能添加事务的管理。

1.3 在转账中添加事务管理

1.3.1 事务管理API

方法摘要
void setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态。
void commit() 使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection 对象当前持有的所有数据库锁
void rollback() 取消在当前事务中进行的所有更改,并释放此 Connection 对象当前持有的所有数据库锁。

1.3.2 在转账中添加事务管理


    @Test
    /**
     * 完成转账的案例
     */
    public void demo1(){
        Connection conn = null;
        PreparedStatement pstmt  = null;
        try{
            /**
             * 完成转账代码:
             * * 扣除某个账号的钱
             * * 给另外一个账号加钱
             */
            // 获得连接:
            conn = JDBCUtils.getConnection();
            // 开启事务
            conn.setAutoCommit(false);
            // 编写SQL语句:
            String sql = "update account set money = money + ? where name = ?";
            // 预编译SQL:
            pstmt = conn.prepareStatement(sql);
            // 设置参数:
            // 用aaa账号给bbb账号转1000元
            pstmt.setDouble(1, -1000);
            pstmt.setString(2, "aaa");
            // 执行SQL:扣除aaa账号1000元
            pstmt.executeUpdate();
            
            int i = 1 / 0;
            
            // 给bbb账号加1000
            pstmt.setDouble(1, 1000);
            pstmt.setString(2, "bbb");
            pstmt.executeUpdate();
            
            // 提交事务:
            conn.commit();
        }catch(Exception e){
            // 回滚事务:
            try {
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally{
            JDBCUtils.release(pstmt, conn);
        }
    }

你可能感兴趣的:(MySQL 基础16 JBDC 事物)