📜  扁平和嵌套分布式事务

📅  最后修改于: 2021-09-10 01:25:54             🧑  作者: Mango

介绍 :
事务是一系列必须以符合 ACID 的方式完成的对象操作。

  • 原子性——
    交易完全完成或根本不完成。
  • 一致性——
    它是一个术语,指的是从一种一致状态到另一种一致状态的过渡。
  • 隔离——
    它与其他交易分开进行。
  • 耐用性 –  
    一旦完成,它是持久的。

交易 – 命令

  • 开始 –
    发起一个新的交易。
  • 犯罪 –
    结束交易并保存交易期间所做的更改。此外,它还允许其他事务查看您所做的修改。
  • 中止——
    结束交易,交易期间所做的所有更改都将被撤消。

为成功运行事务分配了各种角色:

  • 客户 –
    交易由客户发出。
  • 协调员——
    整个事务的执行由它控制(处理开始、提交和中止)。
  • 服务器 –
    每个访问或修改资源的组件都受到事务控制。事务服务器必须知道协调器。事务服务器向协调器注册其参与事务。

访问由不同服务器处理的对象的平面或嵌套事务称为分布式事务。
当分布式事务结束时,为了维护事务的原子性,事务中涉及的所有服务器都必须提交事务或中止事务。
为此,其中一台服务器承担协调器的工作,这需要确保在所有服务器上实现相同的结果。
协调器完成此任务的方法由所选协议决定。最广泛使用的协议是“两阶段提交协议”。该协议使服务器能够相互通信,以便共同决定是提交还是中止整个事务。

扁平和嵌套分布式事务:
如果客户端事务在多个服务器上调用操作,则称其为分布式事务。分布式事务可以通过两种不同的方式构建:

  1. 平交易
  2. 嵌套事务

平交易:
一个平面事务有一个单一的起始点(开始)和一个单一的结束点(提交或中止)。它们通常非常简单,通常用于短期活动而不是大型活动。
客户端在平面事务中向多个服务器发出请求。例如,事务 T 是对服务器 X、Y 和 Z 中的对象执行操作的平面事务。
在继续下一个请求之前,一个平面客户端事务会完成前一个请求。结果,每个事务按顺序访问服务器对象。
当服务器使用锁定时,事务一次只能等待一个对象。

平交易

平面交易的限制:

  • 如果发生崩溃,所有工作都将丢失。
  • 一次只能使用一个 DBMS。
  • 不可能部分回滚。

嵌套事务:
在其发起点和结束点内包含其他事务的事务称为嵌套事务。所以事务的嵌套是在事务中完成的。这里的嵌套事务称为子事务。
嵌套事务中的顶级事务可以打开子事务,每个子事务可以打开更多子事务,向下到任何嵌套深度。
客户端的事务 T 打开两个子事务 T1 和 T2,它们访问服务器 X 和 Y 上的对象,如下图所示。
访问服务器 M、N 和 P 上的对象的 T1.1、T1.2、T2.1 和 T2.2 由子事务 T1 和 T2 打开。

嵌套事务

子事务的并发执行是在同一级别完成的——在嵌套事务策略中。在这里,在上图中,T1 和 T2 调用不同服务器上的对象,因此它们可以并行运行,因此是并发的。
T1.1、T1.2、T2.1、T2.2是四个子事务。这些子事务也可以并行运行。

考虑一个分布式事务 (T),其中客户转移:

  • 卢比105 从账户 A 到账户 C 和
  • 随后,卢比。 205 从账户 B 到账户 D。

它可以被视为/认为是:

Transaction T :
Start
Transfer Rs 105 from A to C : 
Deduct Rs 105 from A(withdraw from A) & Add Rs 105 to C(depopsit to C)
Transfer Rs 205 from B to D : 
Deduct Rs 205 from B (withdraw from B)& Add Rs 205 to D(depopsit to D)
End

假设 :

  1. 帐户 A 在服务器 X 上
  2. 帐户 B 在服务器 Y 上,并且
  3. 帐户 C 和 D 在服务器 Z 上。

交易 T 涉及四个请求——2 个用于存款,2 个用于取款。现在它们可以被视为事务 T 的子事务(T1、T2、T3、T4)。
如下图所示,事务 T 被设计为四个嵌套事务的集合:T1、T2、T3 和 T4。

优势 :
性能高于单笔事务依次调用四个操作。

嵌套事务

因此,事务 T 可以分为子事务:

//Start the  Transaction
T = open transaction
//T1
openSubtransaction
a.withdraw(105);
//T2
openSubtransaction
b.withdraw(205);
//T3
openSubtransaction
c.deposit(105);
//T4
openSubtransaction
d.deposit(205);
//End the trsnaction
close Transaction

协调员的角色:
当分布式事务提交时,参与事务执行的服务器为了适当的协调,必须能够相互通信。
当客户端发起事务时,“openTransaction”请求被发送到任何协调器服务器。联系的协调器执行“openTransaction”并将事务标识符返回给客户端。

分布式事务标识符在分布式系统中必须是唯一的。
一种简单的方法是生成包含两个部分的 TID – 创建它的服务器的“服务器标识符”(例如:IP 地址)和服务器唯一的编号。
发起事务的协调者成为分布式事务的协调者,负责中止或提交事务。

每个管理事务访问的对象的服务器都是事务的参与者并提供一个我们称为参与者的对象。参与者负责与协调器一起完成提交过程。

协调器每次都会在参与者列表中记录新参与者。每个参与者都知道协调者,而协调者也知道所有参与者。这使他们能够收集提交时所需的信息,从而协同工作。