Lecture18-事务-概念

文章目录

    [toc]

    Lecture18-事务-概念

    一、事务要解决的问题

    多条SQL语句全部执行成功,才能完成一个完整的业务逻辑,例如:

    • 转账:A账号转账200元--->B账号
    • 下单:商品销售了5件,单价100元
      • 销量增加5
      • 库存减少5
      • 买家用户资金账号余额减500元
      • 保存订单信息
      • 保存订单详情信息
    • ……

    我们的目标是:当一个业务逻辑中包含多条增删改的SQL语句,那么这些SQL语句要么都成功,要么全部撤销,保证数据库中的数据始终都是正确的状态


    二、事务ACID属性

    • A:原子性Atomicity

      在一个业务逻辑中缺少任何一条SQL语句都构不成一个完整的业务逻辑

    • C:一致性Consistency

      事务执行之前和事务执行之后,数据库中的数据都是正确的状态

      image-20250526141445260

    • I:隔离性Isolation

      在并发环境下执行事务,为了让各个事务之间不会互相干扰,让事务在一定程度上彼此隔离

    • D:持久性Durability

      事务提交之后,对数据的修改就永久的保存到硬盘上,不可撤销


    三、事务隔离级别

    1、并发问题

    并发问题描述
    脏读T1读取了T2尚未提交的修改
    然后T2回滚了
    不可重复读T1内部第一次读取数据和第二次读取同一个数据,二者不相等
    意味着T1执行过程中,有其它事务修改了数据
    比脏读好的是:第二次读取到的数据是其他事务提交后的值
    幻读T1执行过程中,数据库表中记录的数量发生了变化,感觉像是产生了幻觉

    2、隔离级别

    隔离级别描述解决问题
    读未提交当前事务可以读取其它事务尚未提交的修改无
    读已提交当前事务只去读取其它事务已经提交的修改脏读
    可重复读当前事务执行时,锁定数据,不允许其它事务操作脏读
    不可重复读
    串行化当前事务执行时,锁定整个数据库表,不允许其它事务操作所有

    四、事务的JDBC代码实现

    • 编程式事务:我们自己动手,编写代码,实现事务功能
    • 声明式事务:基于框架,通过配置或注解等方式,实现事务功能
    try {
        // 核心操作前
        // 1、获取数据库连接
        conn = JdbcUtils.getConnection();
        
        // 2、开启事务(把事务自动提交关闭)
        conn.setAutoCommit(false);
        
        // 核心操作
        orderService.saveOrder(order, user, cart);
        
        // 核心操作成功之后:提交事务
        conn.commit();
    } catch (Exception e){
        // 核心操作失败之后:回滚事务
        conn.rollBack();
    } finally{
        // 核心操作结束之后:关闭数据库连接
        conn.close();
    }
    
    end