Distributed Transactions
Concurrency Control
ACID
- A: Atomic 原子性,事务要么全部完成,要么全部不完成
- C: Consistent 一致性
- I: Isolated Serializable,多个事务并发执行的结果和某一个顺序的事务线性执行的结果一致
- D: Durable 一旦事务被提交,则事务被持久化,不会因为错误啥的丢失
Abort 事务中断
Atomic Commit
Two-Phase Locking
a. 在使用一条记录时获得对应的资源的锁
b. 持有该锁直到事务结束
get(x) // 执行前获得x锁
get(y) // 执行前获得y锁
// 事务结束统一释放x y锁
该操作可能导致死锁,要引入一些机制处理
Atomic Commit Protocol or Two-phase Commit Protocol
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tzFfoEoA-1663511280433)(https://typora-1303830133.cos.ap-shanghai.myqcloud.com/typora/img/%25E6%2588%25AA%25E5%25B1%258F2022-09-12%252017.17.38.png)]
二阶段提交依赖Transactions Coordinator,由TC负责统筹各个分片,由TC决定提交或是撤销。
- 事务在执行前会先获得锁,在事务提交后释放锁。即遵守Two-Phase Locking
- 事务提交分为Prepare和Commit两个阶段
- Prepare阶段,各个分片会执行事务,但是不会实际提交。这时读不到事务数据。
- Commit阶段,当所有的分片都正确执行事务后进入该阶段,该阶段通知各个分片将事务提交。
错误处理
- 分片在Pre阶段错误: 可以直接返回NO即可。这个区域分片有权直接abort事务。
- 分片在确认Pre但确认Commit前错误:需要在确认PRE前持久化,恢复后接着做就好。这个区域分片无权直接丢弃事务,需要一直等待协调者确认。
- 协调者错误:同样是需要持久化然后恢复。