P12 MIT-6.824 Distributed Transactions 课程观看笔记
分布式事务的构成
- 并发控制
- 原子提交
数据库的ACID
-
原子性
-
一致性
-
隔离性
隔离性即意味着可串行化,即并行的执行一系列事务所得到的结果与按照某种串行顺序执行事务所得到的结果相同。
可串行化对于程序员来说,可以不需要关注底层并发的顺序, 只需要关注每个事务本身。
-
持久化
在事务的执行过程中,如果因为死锁或者异常等行为而失败,我们需要回退该事务中已经完成的部分操作。
并发控制
悲观并发控制
当需要使用数据的时候,通过加锁来对数据进行锁定,为正确性而牺牲性能。
两阶段锁
- 在执行任何数据的读写之前,先获取锁。
- 事务必须持有已经获得的锁,直到事务提交或者Abort
单主机与分布式行为相同。
乐观并发控制
在执行事务时不需要关心其他事务,只在事务最后的时候进行检查,若发生冲突则进行回退,即Abort,若没有则正常结束。
原子性
即事务的每一部分都执行或每一部分都不执行。
两阶段提交(保证原子性协议)
有一个计算机来管理事务(事务协调者),由它向其余服务器发送相对应的消息,其余服务器根据消息来执行事务。
每个持有数据的服务器会维护一个锁的表单,用来记录锁被哪个事务(TID)所持有。
客户端会向事务协调者发送消息并请求运行这个事务,事务协调者向各个服务器发送Prepare消息,当服务器收到prepare消息后,会根据自身状态判断是否能够完成,并给事务协调者一个回复,事务协调者根据回复来判断事务是否可以被提交,若可以则会发送Commit消息给其他服务器,然后服务器回复ACK,若不可以commit则会发送Abort消息进行回退。
commit之后会由事务协调者向客户端发送事务输出的内容,其他服务器会对锁进行释放。
事务协调者先向其余的服务器发送消息并得到服务器的回复,若事务结束了,则释放所有的锁,并使得事务的结果对外部是可见的,再对客户端回复。
故障恢复
在服务器回复Prepare消息之前,必须能够记住事务的中间状态,将中间状态这些信息以log形式在磁盘上持久化存储,这样当回复完yes之后,若崩溃掉,重启可以根据log进行完成。
事务协调者需要将事务的信息以log的形式持久化存储到磁盘中,即在收到所有的Prepare消息Yes、No的投票之后,存入log中,之后才会发送commit消息。
如果网络某个地方出现了问题,或者事务协调器挂了一会,其他服务器仍然在等待Prepare消息,总是可以允许其他服务器Abort事务,并释放锁,这样其他事务才可以继续。
若其他服务器在回复Yes之后,迟迟等不到commit或者Abort消息,则会可能发生block,在这个阶段是不能够进行单方面abort的。
可以将raft以及两阶段提交协议进行融合,来实现容错。