页面加载中
博客快捷键
按住 Shift 键查看可用快捷键
ShiftK
开启/关闭快捷键功能
ShiftA
打开/关闭中控台
ShiftD
深色/浅色显示模式
ShiftS
站内搜索
ShiftR
随机访问
ShiftH
返回首页
ShiftL
友链页面
ShiftP
关于本站
ShiftI
原版/本站右键菜单
松开 Shift 键或点击外部区域关闭
互动
最近评论
暂无评论
标签
寻找感兴趣的领域
暂无标签
    0
    文章
    0
    标签
    8
    分类
    10
    评论
    128
    功能
    深色模式
    标签
    JavaScript12TypeScript8React15Next.js6Vue10Node.js7CSS5前端20
    互动
    最近评论
    暂无评论
    标签
    寻找感兴趣的领域
    暂无标签
      0
      文章
      0
      标签
      8
      分类
      10
      评论
      128
      功能
      深色模式
      标签
      JavaScript12TypeScript8React15Next.js6Vue10Node.js7CSS5前端20
      随便逛逛
      博客分类
      文章标签
      复制地址
      深色模式
      AnHeYuAnHeYu
      Search⌘K
      博客
        暂无其他文档

        4、事务与并发控制

        March 16, 20245 分钟 阅读4 次阅读

        一、知识点

        1. 事务(Transaction)

        事务是数据库执行的一个操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单元。

        事务的ACID特性:

        特性

        含义

        说明

        原子性(Atomicity)

        事务中所有操作要么全部成功提交,要么全部失败回滚

        由日志和回滚机制保证

        一致性(Consistency)

        事务执行前后,数据库从一个一致状态变到另一个一致状态

        由应用程序和约束保证

        隔离性(Isolation)

        多个事务并发执行时,彼此互不干扰

        通过锁机制和隔离级别实现

        持久性(Durability)

        事务一旦提交,其结果永久保存

        通过日志和备份保证

        2. 并发问题

        多个事务同时操作同一数据时,会产生以下问题:

        问题

        描述

        示例

        丢失修改

        两个事务读取同一数据并修改,后提交的覆盖先提交的结果

        T1读A=100,T2读A=100;T1写A=90,T2写A=80 → A=80(T1的更新丢失)

        脏读

        一个事务读取了另一个未提交事务的数据

        T1修改A=90未提交;T2读取A=90;T1回滚 → T2读到脏数据

        不可重复读

        同一事务内两次读取同一数据,结果不同(因其他事务修改并提交)

        T1第一次读A=100;T2修改A=90并提交;T1第二次读A=90 → 不一致

        幻读

        同一事务内两次查询,结果集不同(因其他事务插入或删除)

        T1查询学生表有3条;T2插入1条并提交;T1再次查询得到4条 → 幻影行

        3. 隔离级别

        SQL标准定义了四种隔离级别,由低到高:

        隔离级别

        脏读

        不可重复读

        幻读

        实现方式

        READ UNCOMMITTED(读未提交)

        可能

        可能

        可能

        不加锁

        READ COMMITTED(读已提交)

        不可能

        可能

        可能

        写加锁,读不加锁(或快照读)

        REPEATABLE READ(可重复读)

        不可能

        不可能

        可能(MySQL InnoDB除外)

        读加共享锁,写加排他锁

        SERIALIZABLE(串行化)

        不可能

        不可能

        不可能

        强制事务串行执行

        MySQL InnoDB 的 REPEATABLE READ 通过间隙锁解决了幻读问题。

        4. 锁机制

        • 共享锁(S锁):读锁,多个事务可同时持有,但不允许写。

        • 排他锁(X锁):写锁,任何其他事务不能加任何锁。

        • 意向锁:表级锁,表示事务准备在行上加锁,提高效率。

        • 两段锁协议(2PL):事务分为加锁阶段(只加锁不放锁)和解锁阶段(只放锁不加锁),保证可串行化。


        最后更新于 May 7, 2026
        On this page
        暂无目录