MySQL实战系列 -- 8. 事务操作

276 阅读3分钟

作者: 欢迎观看我的文章, 注定了我们今生有缘分! 我已从事Java开发教育十多年, 怀着教书育人的情怀, 正在让更多的同学们少走弯路, 改变千万IT人的命运!

期待同学动动你的小手给'霈哥'点赞、加关注、分享给更多的朋友共同学习交流, 每天持续更新离不开你的支持! 3Q

欢迎关注我的B站,可观看本文章配套视频~~~ 欢迎关注我的公众号,获取更多资料~~~


学习目标

  • 能够在MySQL中使用事务
  • 能够在JDBC中使用事务
  • 能够在DBUtils中使用事务

第一章 事务操作

  • 事务: 指的是逻辑上的一组操作,组成这组操作的各个单元要么全都成功,要么全都失败.
  • 事务作用:保证在一个事务中多次SQL操作要么全都成功,要么全都失败.

1.1 mysql事务操作

sql语句描述
start transaction开启事务
commit提交事务
rollback回滚事务
  • 准备数据
# 创建账号表
create table account(
	id int primary key auto_increment,
	name varchar(20),
	money double
);
# 初始化数据
insert into account values (null,'jack',10000);
insert into account values (null,'rose',10000);
insert into account values (null,'tom',10000);
  • 操作
    • MYSQL中可以有两种方式进行事务的管理:
      • 自动提交:MySql默认自动提交。即执行一条sql语句提交一次事务。
      • 手动提交:先开启,再提交
  • 手动提交
start transaction;
update account set money=money-1000 where name='jack';
update account set money=money+1000 where name='rose';
commit;
#或者
rollback;

1.2 jdbc事务操作

Connection 对象的方法名描述
conn.setAutoCommit(false)开启事务
conn.commit()提交事务
conn.rollback()回滚事务

代码演示

/*
JDBC 的事务操作
 */
public class TransactionDemo {

    /*
    1.获得连接
    2.开始事务
    3. 具体的sql操作(加钱, 减钱)
    4. 提交事务
    5.如果出现异常, 回滚事务
    6.释放资源
     */
    @Test
    public void test1() throws SQLException {


        Connection conn = null;
        try {
            // 1.获得连接
            conn = DruidUtils.getConnetion();
            //2.开始事务
            conn.setAutoCommit(false);
            //3. 具体的sql操作(加钱, 减钱)
            //减钱
            String sql = "update account set money=money-? where name=?";
            PreparedStatement pstat = conn.prepareStatement(sql);
            pstat.setDouble(1,1000);
            pstat.setString(2,"jack");
            pstat.executeUpdate();

            //模拟错误
            //int n = 1/0;

            //加钱
            sql = "update account set money=money+? where name=?";
            PreparedStatement pstat2 = conn.prepareStatement(sql);
            pstat2.setDouble(1,1000);
            pstat2.setString(2,"rose");
            pstat2.executeUpdate();
            // 4. 提交事务
            conn.commit();

        } catch (Exception e) {
            e.printStackTrace();
            //5.如果出现异常, 回滚事务
            conn.rollback();
        }
    }
}

1.3 DBUtils事务操作

Connection对象的方法名描述
conn.setAutoCommit(false)开启事务
new QueryRunner()创建核心类,不设置数据源(手动管理连接)
query(conn , sql , handler, params ) 或
update(conn, sql , params)
手动传递连接, 执行SQL语句CRUD
DbUtils.commitAndCloseQuietly(conn)提交并关闭连接,不抛异常
DbUtils.rollbackAndCloseQuietly(conn)回滚并关闭连接,不抛异常

代码演示

/*
DBUtils 的事务操作
 */
public class TransactionDemo2 {

    /*
    1.获得连接
    2.开始事务
    3.具体的sql操作(加钱, 减钱)
    4.提交事务 ,释放资源
    5.如果出现异常, 回滚事务释放资源
     */
    @Test
    public void test1() throws SQLException {
        Connection conn = null;
        try {
            //1.获得连接
            conn =  DruidUtils.getConnetion();
            // 2.开始事务
            conn.setAutoCommit(false);
            // 3.具体的sql操作(加钱, 减钱)
            QueryRunner qr = new QueryRunner();
            //减钱
            String sql = "update account set money=money-? where name=?";
            qr.update(conn, sql, 1000, "jack");
            //模拟错误
            int n =1/0;
            //加钱
            sql = "update account set money=money+? where name=?";
            qr.update(conn, sql, 1000, "rose");
            //4.提交事务 ,释放资源
            DbUtils.commitAndCloseQuietly(conn);
        } catch (Exception e) {
            e.printStackTrace();
            //5.如果出现异常, 回滚事务释放资源
            DbUtils.rollbackAndCloseQuietly(conn);
        }
    }
}