2PCは何ですか
二相が準備フェーズにプロトコル、全体のグローバル・トランザクションをコミットすること2PC、コミット・フェーズ。
- 準備段階では(準備フェーズ):Transaction Managerは、各地域の情勢は、各ローカル・トランザクションの実行現地情勢メッセージを準備するために送られますが、コミットされません。そして、地元の元に戻す/やり直しのログを書き込みます。そして、ロックリソースを保持し続けます。
元に戻す:ロールバックトランザクションのデータベースの変更の前に記録したデータ。
やり直し:変更データベースのレコードデータ、ユーザーがトランザクションを送信します。 - (あなたがトランザクションマネージャのローカルトランザクションが失敗したというメッセージを受け取った場合、メッセージは直接各地域の情勢にロールバック(ロールバック)が送信され、そうでない場合は、各ローカル・トランザクションを送信するためにトランザクションマネージャがコミットメッセージを:フェーズコミット(フェーズコミット) )コミットします。各地域の業務トランザクションマネージャロールバックにしたがってやニュース、リソースを提出し、ロックを解除します。
成功の伝説
伝説の失敗
特定のプログラムの二つの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に実装されています。
プロセスは、例えば、新規ユーザ登録送信統合、ユーザデータベースと統合ライブラリは同じライブラリではありません。
- アプリケーション(AP)は、2つのユーザーライブラリとライブラリのデータソースとの統合を保持しています。
- アプリケーション(AP)ときに、ユーザ・ポイントとは、リソースのロック、RMはこの時点でトランザクションをコミットしませんでした、TM RM新規ユーザーによるユーザー・ライブラリーに通知し、ユーザーがポイントを追加するためのライブラリRM統合を通知します。
- TM收到执行回复,只要有一方失败则分别向其他RM发起回滚事务,回滚完毕,资源锁释放。
- 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工作流程
拿新用户注册送积分举例,用户库与积分库不是同一个库:
- 用户服务的TM向TC申请开启一个全局事务,TC全局事务开启成功,并生成一个全局唯一XID返回给TM。
- 用户服务RM带着XID向TC注册分支事务,TC将其纳入XID对应的全局事务,并返回BranchID。
- 用户服务执行分支事务,向用户表插入数据,并向undo_log写入数据(用于回滚),并提交分支事务,然后向TC上报分支事务执行结果。
- 用户服务带着XID调用积分服务。
- 积分服务RM带着XID向TC注册分支事务,TC将其纳入XID对应的全局事务,并返回BranchID。
- 积分服务执行分支事务,向积分表插入数据,并向undo_log写入数据(用于回滚),积分服务返回用户服务,并提交分支事务,然后向TC上报分支事务执行结果。
- 用户服务TM向TC发起针对XID的全局提交或回滚。
- TC调度XID下的全部分支事务完成提交或回滚。
成功图例:
回滚图例:
3.3 Seata与传统2PC比较
- RM区别:传统2PC的RM在数据库层,实际是数据库本身,通过XA协议实现。而Seata以Jar的形式作为中间件部署在应用层。
- 分支事务提交时间:2PC在第二阶段,Seata在第一阶段。提高了性能。