分布式事务
Posted xiaona-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式事务相关的知识,希望对你有一定的参考价值。
分布式事务
1.什么是事务
事务是用于访问和修改各种数据项的一个程序单位,这个程序要么全部执行,要么全部放弃。
2.为什么会引入事务的概念
针对于数据库来说,对数据文件的记录进行访问或修改,对这些数据项的修改封装起来来保证对数据项的访问或修改的原子性、一致性、隔离性、持久性。
3.事务的属性
(1)原子性:所有的工作要么在数据库中保存下来,要么全部回滚,全部不保留;
(2)一致性:事务完成或者撤销之后应该处于一致的状态;
(3)隔离性:多个事务同时进行互相互不干扰;
(4)持久性:事务提交后,所做的工作就被永久的保存下来。
4.事务的实现
(1)私有工作空间与影子更新
当进程启动事务T时,分配一个私有工作空间W,在提交或终止T前所有的读写操作都是在W中进行。
在(a)中,在对某文件进行访问时,共有三个数据块,在磁盘中对应于盘块0,、盘块1、盘块2,(b)当进程启动该事务时,便分配给它一个私有工作空间,如果我们现在要对盘块0和盘块3进行修改操作,那么就会在相应的0‘和3’中进行,所有对文件的访问都是在私有工作空间进行的,在事务提交之前,对文件没有产生影响,访问的索引节点还是起初的索引节点,(c)在事务提交之后,那么影子块就会变成真正的盘块,私有工作空间的索引节点替代起初的索引节点。
(2)先写日志(WAL)
日志能够记录事务标识、访问数据项的名字、初值、修改后的值等。(日志记录【事务标识,文件标识,块号,前像,后像,事务的状态】)日志能回滚是在保证事务的原子性,当事务在进行的过程中由于系统发生故障,事务进行不下去了,那么此时在系统中可能存在若干个事务,也可能其中有的事务已经提交了(已经提交的事务对数据的影响已经发生),有的事务还没有完全提交,那么现在就要对未完全提交的事务通过日志进行回滚,把对数据项的修改将旧值替代新值,进行恢复,这样就可以保证事务的原子性。
b、c、d分别表示在执行完第四、五、六行代码之后日志的记录,例如:x=0/1表示x在修改之前未0,修改之后变成1,即分别是前像和后像,当事务在END之前要进行回滚时,就依次将修改前的值恢复,比如在(d)中,首先将x的4恢复为1,然后将1变为0,而y则由2变为0。保证了事务的原子性,也就保证了事务的一致性。
总结:
5.什么是分布式事务
在一个事务的执行中,它可能会涉及多个服务器。分为简单分布式事务和嵌套事务。
简单分布式事务:一个客户可以请求多台服务器,但是每台接收客户请求的服务器并不调用其他服务器的操作。
嵌套事务:一个服务器的一个操作可能触发另一个服务器的某个操作,通常后者又可能进一步请求操作,以此类推,同层次的子事务可以并发执行。
事务的第一个服务器成为事务的协调者,负责终止或提交事务,管理分布式事务访问的对象的每个服务器都是事务的参与者,每个事务参与者负责跟踪所有参与分布式事务的可恢复对象。在事务的执行过程中,协调者在列表中记录所有对参与者的引用,每一个参与者也记录一个对协调者的引用。
事务标识符TID分为创建该事务的服务器标识符(IP)和对该服务器来说是唯一的数字两部分。
在下面的例子中,A, B, C, D分别是账户,X, Y, Z分别是服务器,在这里A账户在服务器X上,B账户在服务器Y上,账户C和D在Z上,服务器Z作为协调者,服务器Y和Z作为参与者。
6.原子提交协议
原子提交协议:以原子方式完成事务的方式。
两阶段提交协议:准备和执行两个阶段。
7.分布式事务的并发控制
每个服务器管理很多对象,他必须保证在并发事务访问这些对象时,这些对象仍然保持一致性,因此,每个服务器需要对自己的对象应用并发控制机制。分布式事务所有服务器共同保证事务以串行等价方式执行,这就意味着,如果事务T对某一服务器对象冲突访问在事务U之前,那么在所有服务器上对对象的冲突操作,事务T都在U之前。
(1)锁机制
在一个分布式事务中,每个服务器都为其数据项保留锁,本地锁管理者可以决定时授予锁还是让请求的事务等待,当他知道事务已在参加该事务的所有服务器上提交或者终止之前不能释放锁。由于服务器彼此独立地设置它们的锁,有可能不同服务器将不同的次序加于事务上,就可能出现分布式死锁的情况。
(2)分布式事务的时间戳定序并发控制
每个文件带有对它操作的最后一个提交事务的读时间戳、写时间戳。如果当前事务T的时间戳>文件的时间戳,则执行,否则,废弃T。
(3)分布式事务的乐观并发控制
读阶段:将文件读入私有工作区;
确认阶段:提交前,检查是否有冲突,如果有,那么久废弃事务,否则提交事务。
写阶段:如果可以提交,则将修改内容从私有工作区写入文件。
8.分布式事务的死锁
边追逐法(死锁检测)
当服务器1发现某个事务T开始等待事务U时,而U在等待服务器2上的对象时,服务器1发送一个T->U的探针消息来启动一次检测过程,这个消息发给阻塞U的服务器2。
在上面的算法中,死锁涉及的每个事务都可能发起死锁检测,环路上的多个事务同时发起死锁检测或造成死锁检测在多个服务器上被执行,会使得多个事务被放弃。所以我们可以定义事务的优先级,这样就可以减少初始化死锁检测的数目,以及向前发送探针的数目。
以上是关于分布式事务的主要内容,如果未能解决你的问题,请参考以下文章