Files
Hui-s-notebook/logseq-java/pages/MySQL事务.md
2024-02-02 00:12:49 +08:00

2.1 KiB
Raw Blame History

  • 数据库操作的最小单元
  • 作为一个整体一起向系统提交
  • 事务是一组不可拆分的操作集合
  • ACID
    • 原子性
      • 要么都执行,要么都不执行
    • 一致性
      • 事务执行前后是从一个一致性状态到另一个一致性状态
    • 隔离性
      • 事务之间互不干扰
    • 持久性
      • 事务一旦完成修改永久保存
  • 并发事务的问题
    • 脏读
      • 读取到了另一个事务未提交的数据
    • 丢失修改
      • 一个事务修改了这个数据,但是另一个事务也修改了这个数据,这个时候第一个事务的修改结果就丢失了
    • 不可重复读
      • 一个事务多次读取同一个数据,读取到的结果不一样
    • 幻读
      • 一个事务多次查询返回的结果总数不一样
  • 避免事务的并发问题
    • 配置事务隔离级别
    • 读未提交
    • 读已提交
    • 可重复读
    • 串行化
  • 默认情况下使用默认的隔离级别,一致性要求高就使用较高的事务隔离级别
  • 靠缓存可以提升事务隔离级别的性能
    • 有缓存只能提供高效读,不能保证数据即时一致性,还需要额外开销管理缓存
  • 隔离实现方案
    • 读写锁
      • 锁定读,共享读锁之间不会排斥,写锁会排斥其他锁
      • 锁竞争时,要等待其中一个操作释放锁另一个才能获取锁
      • 行锁
      • 间隙锁
      • select lock in share mode
      • select lock for update
      • insert、update、delete
    • MVCC
      • 一致性非锁定读
      • 隐藏字段
        • DB_TRX_ID标记最近一次对本行记录做修改的事务id
        • DB_ROLL_PTR回滚指针指向改行的undolog
        • DB_ROW_ID没有主键和唯一列时会使用该id生成聚簇索引
      • Read View
        • 记录和隔离不同事物并发时此纪录哪些版本对当前事务可见
      • Undolog
        • 回滚数据,读取可见版本的数据
  • 一致性、原子性如何实现
    • 通过MVCC实现
    • 灾备通过redolog实现redolog会记录下来所有修改崩溃后可以通过redolog恢复修改
  • 持久性如何实现
    • redolog实现事务提交的时候先将所有日志写入日志文件进行持久化即WALwrite ahead log机制