ローカルトランザクションと分散トランザクション(セクション03)取引ソリューション-2PC(2フェーズ・コミット)分散

2PCは何ですか

二相が準備フェーズにプロトコル、全体のグローバル・トランザクションをコミットすること2PC、コミット・フェーズ。

  1. 準備段階では(準備フェーズ):Transaction Managerは、各地域の情勢は、各ローカル・トランザクションの実行現地情勢メッセージを準備するために送られますが、コミットされません。そして、地元の元に戻す/やり直しのログを書き込みます。そして、ロックリソースを保持し続けます。
    元に戻す:ロールバックトランザクションのデータベースの変更の前に記録したデータ。
    やり直し:変更データベースのレコードデータ、ユーザーがトランザクションを送信します。
  2. (あなたがトランザクションマネージャのローカルトランザクションが失敗したというメッセージを受け取った場合、メッセージは直接各地域の情勢にロールバック(ロールバック)が送信され、そうでない場合は、各ローカル・トランザクションを送信するためにトランザクションマネージャがコミットメッセージを:フェーズコミット(フェーズコミット) )コミットします。各地域の業務トランザクションマネージャロールバックにしたがってやニュース、リソースを提出し、ロックを解除します。

成功の伝説

伝説の失敗

特定のプログラムの二つの2PC XA実装

  2PC的传统方案是在数据库层面实现的,如Oracle、MySQL都支持2PC协议,为了统一标准减少行业内不必要的对接成本,需要制定标准化的处理模型及接口标准,国际开放标准组织Open Group定义了分布式事务处理模型 DTP(Distributed Transaction Processing Reference Model)。 

DTPモデルは、いくつかの役割を定義します。

  • RM(リソースマネージャ):エクスプローラは、トランザクションの参加、分岐トランザクションの制御として理解することができます。
  • TM(トランザクションマネージャ):トランザクション管理、グローバル・トランザクション、グローバルトランザクションのライフサイクル管理、様々なRMの調整を制御します。
  • AP(アプリケーションプログラム):アプリケーションは、それがDTPの使用は理解されています。

XAプロトコルインタフェース仕様は、TMとRMとの間で通信することを
XAの実施形態は、データベース・スキームXA 2PCプロトコルに基づいて実施され、例えば:JTA(Javaトランザクションマネージャ):Java仕様は、Java XAに実装されています。

プロセスは、例えば、新規ユーザ登録送信統合、ユーザデータベースと統合ライブラリは同じライブラリではありません。

  1. アプリケーション(AP)は、2つのユーザーライブラリとライブラリのデータソースとの統合を保持しています。
  2. アプリケーション(AP)ときに、ユーザ・ポイントとは、リソースのロック、RMはこの時点でトランザクションをコミットしませんでした、TM RM新規ユーザーによるユーザー・ライブラリーに通知し、ユーザーがポイントを追加するためのライブラリRM統合を通知します。
  3. TM收到执行回复,只要有一方失败则分别向其他RM发起回滚事务,回滚完毕,资源锁释放。
  4. TM收到执行回复,全部成功,此时向所有RM发起提交事务,提交完毕,资源锁释放。

XA方案的缺点:

  • 需要数据库支持XA协议,不过大部分常用数据库都支持(MySql、Oracle)。
  • 资源锁持续了两个阶段,性能较差。

三 2PC具体实现方案之Seata方案

3.1 什么是Seata

Seata是阿里巴巴中间件团队发起的开源项目Fescar,后更名为Seata,是一款开源的分布式事务框架。
Seata作用于应用层通过对本地事务的协调完成全局事务。对业务0侵入来解决微服务下的分布式事务问题,目前提供AT模式(即2PC)和TCC模式的分布式事务解决方案。

3.2 Seata三大组件

Seata定义了三大组件来处理分布式事务:

  • 事务协调器(Transaction Coordinator):独立的中间件,需要独立部署。维持全局事务的状态,接受TM发起全局事务的提交与回滚,负责RM通信协调各分支事务的提交与回滚。
  • 事务管理器(Transaction Manager):需要嵌入应用程序中工作,负责向TC发起全局事务,并最终向TC发起全局提交或全局回滚。
  • 资源管理器(Resource Manager):控制分支事务,接受TC的指令,驱动分支事务的提交与回滚。

3.2 Seata工作流程

拿新用户注册送积分举例,用户库与积分库不是同一个库:

  1. 用户服务的TM向TC申请开启一个全局事务,TC全局事务开启成功,并生成一个全局唯一XID返回给TM。
  2. 用户服务RM带着XID向TC注册分支事务,TC将其纳入XID对应的全局事务,并返回BranchID。
  3. 用户服务执行分支事务,向用户表插入数据,并向undo_log写入数据(用于回滚),并提交分支事务,然后向TC上报分支事务执行结果。
  4. 用户服务带着XID调用积分服务。
  5. 积分服务RM带着XID向TC注册分支事务,TC将其纳入XID对应的全局事务,并返回BranchID。
  6. 积分服务执行分支事务,向积分表插入数据,并向undo_log写入数据(用于回滚),积分服务返回用户服务,并提交分支事务,然后向TC上报分支事务执行结果。
  7. 用户服务TM向TC发起针对XID的全局提交或回滚。
  8. TC调度XID下的全部分支事务完成提交或回滚。

成功图例:

回滚图例:

3.3 Seata与传统2PC比较

  • RM区别:传统2PC的RM在数据库层,实际是数据库本身,通过XA协议实现。而Seata以Jar的形式作为中间件部署在应用层。
  • 分支事务提交时间:2PC在第二阶段,Seata在第一阶段。提高了性能。

おすすめ

転載: www.cnblogs.com/NEWHOM/p/12399649.html