【数据库】分布式事务入门

1.传统的数据库ACID

A原子性

C一致性

I隔离性

D持久性

2.在数据库分库后 如何保证不在同一个数据库上的数据库操作保持事务性?分布式事务。

3.分布式事务顾名思义就是要在分布式系统中实现事务,它其实是由多个本地事务组合而成。

2PC二阶段提交(数据库层面)

4.二阶段提交是一种强一致性设计,2PC 引入一个事务协调者的角色来协调管理各参与者(也可称之为各本地资源)的提交和回滚,

二阶段分别指的是准备(投票)和提交两个阶段。

5.准备阶段:协调者会给各参与者发送准备命令,你可以把准备命令理解成除了提交事务之外啥事都做完了。(下图1、2)

提交阶段:协调者收到各个参与者的准备成功命令,发送提交命令给各参与者。

 

 准备阶段失败:第一阶段有一个参与者返回失败,那么协调者就会向所有参与者发送回滚事务的请求,即分布式事务执行失败。

 

 提交阶段失败:

第一种是第二阶段执行的是回滚事务操作,那么答案是不断重试,直到所有参与者都回滚了,不然那些在第一阶段准备成功的参与者会一直阻塞着。

第二种是第二阶段执行的是提交事务操作,那么答案也是不断重试,因为有可能一些参与者的事务已经提交成功了,这个时候只有一条路,就是头铁往前冲,不断的重试,直到提交成功,到最后真的不行只能人工介入处理

 
协调者的超时机制:
在第一阶段超时的话,证明事务失败,向所有参与者发送回滚指令。

总结:2PC分布式事务尽量保证强一致性的分布式事务,因此它是同步阻塞的,而同步阻塞就导致长久的资源锁定问题,总体而言效率低,并且存在单点故障问题,在极端条件下存在数据不一致的风险。
 

3PC三阶段提交(数据库层面)

3PC 的出现是为了解决 2PC 的一些问题,相比于 2PC 它在参与者中也引入了超时机制,并且新增了一个阶段使得参与者可以利用这一个阶段统一各自的状态。

6.

3PC 包含了三个阶段,分别是准备阶段、预提交阶段和提交阶段,对应的英文就是:CanCommit、PreCommit 和 DoCommit

3PC 的准备阶段协调者只是询问参与者的自身状况,比如你现在还好吗?负载重不重?这类的。

3PC的预提交阶段 就是2PC的准备阶段,负责将除了提交以外的所有事情完成。

 

 7.预提交阶段相当于一个栅栏,证明在准备阶段的所有参与者都有能力 有条件(没有被其他事务阻塞)参与此次事务。

当一个参与者进入预提交阶段,证明其余参与者都进入预提交阶段。

8.参与者的超时机制:

预提交阶段的预提交命令超时,则放弃该次事务,毕竟什么也没开始做。

提交阶段的提交命令超时,则参与者自动提交该事务。

 

总结:3PC 相对于 2PC 做了一定的改进:引入了参与者超时机制,并且增加了预提交阶段使得故障恢复之后协调者的决策复杂度降低,但整体的交互过程更长了,性能有所下降,并且还是会存在数据不一致问题。

 

TCC模型分布式事务(业务层面)

TCC 指的是Try - Confirm - Cancel

    • Try 指的是预留,即资源的预留和锁定,注意是预留。
    • Confirm 指的是确认操作,这一步其实就是真正的执行了。
    • Cancel 指的是撤销操作,可以理解为把预留阶段的动作撤销了。

1)一个事务要执行A、B、C三个操作,那么调用者先对三个操作执行预留动作。

2)如果都预留成功了则通知事务管理者执行确认操作,如果有一个预留失败那就都执行撤销动作。

TCC模型还有个事务管理者的角色,用来记录TCC全局事务状态并提交或者回滚事务。

 

 

本地事务表

 

posted @ 2021-04-08 11:29  枫叶像思念  阅读(152)  评论(0编辑  收藏  举报