DDIA 第7章 事务

DDIA 第7章 事务

ACID解析

  • A 原子性–即 可中止性
  • C 一致性–由应用层维护,保证业务逻辑的恒等性
  • I 隔离性–用于保证多个事务并发执行的时候,其结果和串行执行一样
  • D 持久性–即,能持久保存

主要关注的是,隔离性

隔离级别

读提交

  • 能防止 脏读、脏写
  • 读到的数据:是“读”这个语句前能获取的
  • 实现方式:
    • 对于脏写:加行锁
    • 对于脏读:加读锁;或维护两个版本(维护旧值和当前持锁事务将要修改的新值两个版本。MVCC实现了)

可重复读

  • 即,快照级别的隔离
  • 读到的数据:事务开始前的快照
  • 实现方式:MVCC
  • 是MySQL的默认隔离级别
  • 实现方式:
    • 对于脏写:加行锁
    • 对于脏读:MVCC实现。每当写入数据时,都会附加上create_by和delete_by

串行化

  • 实现方式:

      1. 实际串行执行----单线程的执行
      2. 两阶段锁
      3. 可串行化的快照隔离
实际串行执行

特点:

  1. 把要查的数据放在内存里;
  2. 吞吐量上限是的那个cpu内核的吞吐量 ???
  3. 使用存储过程来加速
  4. 使用分区存储,来利用机器的多核cpu
两阶段加锁
  • 读,写锁,(对于串行化的隔离级别,在事务执行前,就要获取锁)
  • 谓词锁,或索引区间锁(next-key locking),来处理幻读
可串行化的快照隔离
  • 是一种乐观并发控制
  • 在 事务提交时,数据库会检查是否发生了冲突。具体就是检测:
    • 读取是否会作用于一个即将过期的MVVC对象
    • 检查写入是否影响即将完成的读取
  • 具体的性能比较的细节。

补充

防止更新丢失

  • 背景:读提交和可重复读,解决的是只读事务遇到 并发写时的问题,而这个是用于并发写(比脏写更复杂)
  • 概念:更新丢失,由并发的 read-modify-write导致
  • 解决方式:
    • 原子写操作:例如update xxx set c = c+1 where xxxxxxx
    • 显式加锁:select for update 这会让返回的所有结果都加锁
    • 自动检测更新丢失:先让事务并发执行,若事务管理器检测到了更新丢失的风险,则中止当前事务。innodb不支持
    • 原子比较和设置:对于不支持事务的数据库 在update 的时候,where语句里,再次包含了”旧条件“

写倾斜和幻读

定义:

  • 可以当作一种更广义的 更新丢失【更新丢失,是不同事务更新同一个对象,写倾斜是不同事务更新 不同对象】
  • 1 首先查询; 2 根据查询做增删改操作; 而这个操作会改变 2 执行的前提条件

解决方式:

  • 使用可串行化的 隔离级别
  • 如果不能使用可串行化的级别,对于某些情况,可以使用 select for update
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值