1.多个并发操作正确性的概念:如果保证每个结果都可以通过纯串行应用这些相同的操作来获得。
2.保证(1)正确的旧状态 (2)正确的一些列操作 ——> 正确的新状态
3.before-or-after atomicity定义指的是每一个before-or-after 行为都在另一个before-or-after 行为完全结束或还未开始时运行。保证了操作的序列化
1.Simple Locking类似于the mark-point discipline标记点原则的思想
2.Simple Locking有两个规则:(1)每个事务读写数据之前要先获取要读写数据的锁。(2)直到事务完成并提交/数据已完全保存并中止才能释放锁
3.the mark-point discipline:事务有一个lock point:第一个获得了所有锁的时刻。获得的所有锁叫做lock set。
4.lock manager强制Simple Locking每个事务在begin_transaction操作时,将它需要的lock set作为参数传入,如果有必要就等待锁可用。
1.第三种锁原则,两阶段锁,类似read-capture discipline,避免了事务需要提前知道获取哪些锁的要求。
2.两阶段锁允许事务在进行中获得锁,一个事务可以在获取对象的锁之后马上读写该数据对象。也允许事务释放锁,只要不再需要读取该对象。
3.两阶段锁名字来源于:一个事务获得的锁数量,在达到lock point之前是单调递增的,这是第一个阶段;超过了lock point,是单调递减的,这是第二个阶段。
1.联合一个带有持续发送者的两阶段提交协议、复制压制和单点事务,我们可以创建一个正确的多点事务。
2.多点事务的难题:协调者和worker之间不能可靠的通信。
解决:构造可靠的两阶段提交协议的分布式版本,应用持久发送者和副本抑制。
3.阶段一:
A 为协调者, B C D 为worker
A ——>B : Please do X as part of my transaction.
B——>A: My part X is ready to commit.
A——>B:PREPARE to commit X.
B——>A: I am PREPARED to commit my part. Have you decided to commit yet? Regards.(准备消息)
(此时A作为协调者容易成为单点故障,如果A崩溃,其他worker都要等待A恢复)
如果此时所有的worker都回复了准备消息,两阶段提交的第一个阶段结束。
如果有一个worker回复了中止消息,或没回复,则A将中止整个事务或者试图将一个另外的worker点来操作这个组件事务。
4.阶段二:
当A标记她自己的输出日志committed时,A提交了整个事务,此时第二阶段开始。
A——>B:My transaction committed. Thanks for your help.
每个worker收到这个消息后,将它的状态从perpared改为committed,执行完需要的提交后置操作后,退出。
而A也可以去做其他的事务了,但是A必须永久记录完成事务的输出,为了防止有还在prepared状态的worker因网络等原因没收到完成的消息,它会重发,A收到后就会重新发送对应事务的输出记录。
5.因为worker作为他们prepared信息的persistent senders,所以A可以确信每个worker最终都会得到她committed的信息,但是却无法保证是实时的。
6.如下图所示,如果无故障,N个worker点的两阶段提交将在3N个消息完成:每一个worker点有prepare信息,prepared的回复信息 和 提交信息。
7.有的版本的两阶段协议还有第四种信息——从worker点到coordinator的确认信息,来统计worker是否收到committed信息。如果所有worker都已收到,coordinator可以安全的丢弃该事务的输出记录。
8.有些更关注输出记录存储空间和额外信息消耗的系统有些优化,叫做presumed commit(推测提交)
因为预期最多的信息是:committed,所以将committed的信息省略为non-existence。
9.两阶段提交未解决所有的多点原子性问题:如(1)coordinator的崩溃,导致worker们进度无法推进。(2)coordinator和worker之间实时性同步的问题.