《分布式系统原理与范型》
1、 与互斥紧密相连的一个概念是 事务。事务保护一个共享资源不会被几个并发进程同时访问。事务允许进程把访问和修改数据项做为一项单独的原子操作来完成。如果进程在事务处理期间中途退出,所有数据恢复到事务开始前的状态。
2、事务的ACID特征:参考http://zh.wikipedia.org/zh-cn/ACID
- 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
- 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的默认规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
- 隔离性:当两个或者多个事务并发访问(此处访问指查询和修改的操作)数据库的同一数据时所表现出的相互关系。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
- 持久性:在事务完成以后,该事务对数据库所作的更改便持久地保存在数据库之中,并且是完全的。
目前主要有两种方式实现ACID:第一种是Write ahead logging,也就是日志式的方式。第二种是Shadow paging。
3、原子性、持久性的实现,两种技术 write ahead logging ; shadow paging
a\ shadow paging ,也可以叫做私有空间。
当一个进程开始处理一个事务时,它被分配一个私有空间,该空间包含所有他有权访问的文件。在事务提交或终止前,它的所有读写操作都在该私有空间内进行。
把所有东西都复制到私有空间开销很大,可以进行优化。
第一种优化: 当一个进程只是读一个文件而不修改时,不需要私有拷贝。当进行修改操作时,如果没有复制到私有空间,则将文件复制到私有空间。
第二种优化:不复制整个文件,只是将索引复制到私有空间,读操作时可以不复制文件块,如果对文件块进行修改时,将相应文件块先复制到私有空间,修改私有空间内的索引节点。(因为文件系统都是分块存储在磁盘上的,这样不用复制整个文件)
b\ 写前日志
使用这种方法,文件被正在修改,任何一个数据块被修改前,一条记录写到日志中,记录哪个事务对文件修改,哪个文件、哪个数据被访问了,旧值、新值是多少。
如果事务提交,一条提交记录写入日志。
如果事务终止,利用日志退回到原来状态。
4、事务的并发控制
并发控制的目的是允许几个事务同时执行,但是被操作的数据项集合要保持一致的状态。
通过允许事务以某一特定的顺序存取数据项,藉此使最后得到的结果跟事务顺序执行的一样,从而实现这种一致性。
并发控制的总体思想是正确地调度相冲突的操作,如果两个操作对同一个数据操作则可能发现 读写冲突、写写冲突。
并发控制通常根据读写操作同步的方式来分类,可以通过共享数据上的互斥机制(例如锁), 或者 使用时间戳排序来实现;并发控制算法可以进一步分为悲观算法,乐观算法。(悲观锁,乐观锁,悲观时间戳,乐观时间戳)
5、两阶段锁定(是一种悲观锁)
two-phase locking ,2PL,(区别分布式事务提交协议 2PC)