DevTestOpsGuide

开发 测试 上线 的经验与笔记

View project on GitHub

事务

ACID

  • 原子性 atomicity
  • 一致性 consistency
  • 隔离性 isolation
  • 持久性 durability

隔离级别

| 隔离级别 | 脏读 | 不可重读 | 幻读 | 英文名 | 默认 | | ———– | —- | ——– | —- | —————- | —– | | RU 读未提交 | √ | √ | √ | Read uncommitted | | | RC 读已提交 | × | √ | √ | Read committed | 其他 | | RR 可重读 | × | × | √ | Repeatable read | MySQL | | S 串行化 | × | × | × | Serializable | |

  • 读未提交 = 脏读,没有隔离性,Saga 分布式事务的缺点
  • 读已提交 = 不可重读:更新,一个事务两次读取内容不一样
  • 幻读:插入,一个事务两次读取条数不一样,MySQL 用 MVCC 解决
  • 多版本并发控制 MVCC Multiversion Concurrency Control
    • DB_TRX_ID 最近增改事务ID
    • DB_ROLL_PTR 回滚指针,上一版本 0x…
    • DB_ROW_ID 自增ID,没有主键时的聚簇索引,select _rowid
    • DELETED_BIT 删除

CAP

  • 一致性 Consistency
  • 可用性 Availability
  • 分区容错性 Partition tolerance

一般要求AP,C只需要保证最终一致性,所以有日终对账程序

与缓存一致性

  • 先更新数据库,避免刚删完缓存就被其他线程刷入旧数据
  • 缓存使用删除而不是更新,避免更新时数据库内容已经变了

缓存问题

  • 缓存穿透:反复攻击不存在的数据,解决:不存在就set key null ex 30
  • 缓存击穿:并发去库里查一个
  • 缓存雪崩:大批量失效查库

Redis 事务

Redis MySQL
multi begin
exec commit
discard rollback
watch (lock)

分布式锁

问题 数据库 Redis Zookeeper
实现 insert delete set 键 id ex 秒 nx  
异常   靠ex 客户端挂掉时节点就自动删除了
阻塞 轮询 轮询 顺序创建、通知
重入   MAC + jvm进程ID + 线程ID 与当前最小节点对比
单点   集群部署 集群部署

分布式事务

  • 分支事务执行时要拒绝回滚执行
  • 已经失败的事务直接返回回滚成功
  • 多次收到分支事务要幂等