• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > 手把手教你用PHP完成一个分布式事务TCC

手把手教你用PHP完成一个分布式事务TCC

作者:站长图库 字体:[增加 减小] 来源:互联网 时间:2022-04-29

站长图库向大家介绍了PHP事务TCC,分布式事务TCC等相关知识,希望对您有所帮助

什么是TCC,TCC是Try、Confirm、Cancel三个词语的缩写,最早是由 Pat Helland 于 2007 年发表的一篇名为《Life beyond Distributed Transactions:an Apostate’s Opinion》的论文提出。

TCC组成

TCC分为3个阶段

Try 阶段:尝试执行,完成所有业务检查(一致性), 预留必须业务资源(准隔离性)

Confirm 阶段:如果所有分支的Try都成功了,则走到Confirm阶段。Confirm真正执行业务,不作任何业务检查,只使用 Try 阶段预留的业务资源

Cancel 阶段:如果所有分支的Try有一个失败了,则走到Cancel阶段。Cancel释放 Try 阶段预留的业务资源。

TCC分布式事务里,有3个角色,与经典的XA分布式事务一样:

AP/应用程序,发起全局事务,定义全局事务包含哪些事务分支

RM/资源管理器,负责分支事务各项资源的管理

TM/事务管理器,负责协调全局事务的正确执行,包括Confirm,Cancel的执行,并处理网络异常

如果我们要进行一个类似于银行跨行转账的业务,转出(TransOut)和转入(TransIn)分别在不同的微服务里,一个成功完成的TCC事务典型的时序图如下:


手把手教你用PHP完成一个分布式事务TCC

TCC实践

下面我们进行一个TCC事务的具体开发

目前可用于TCC的开源框架,主要为Java语言,其中以seata为代表。我们的例子采用nodejs,使用的分布式事务框架为dtm,它对分布式事务的支持非常优雅。下面来详细讲解TCC的组成

下面我们来编写具体的Try/Confirm/Cancel的处理函数

$vega->handleFunc('/api/TransOutTry', function (Mix\Vega\Context $ctx) {    var_dump('TransOutTry', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());    $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransOutConfirm', function (Mix\Vega\Context $ctx) {    var_dump('TransOutConfirm', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());    $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransOutCancel', function (Mix\Vega\Context $ctx) {    var_dump('TransOutCancel', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());    $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransInTry', function (Mix\Vega\Context $ctx) {    var_dump('TransInTry', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());    $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransInConfirm', function (Mix\Vega\Context $ctx) {    var_dump('TransInConfirm', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());    $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransInCancel', function (Mix\Vega\Context $ctx) {    var_dump('TransInCancel', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());    $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');

到此各个子事务的处理函数已经OK了,然后是开启TCC事务,进行分支调用

Dtmcli\tccGlobalTransaction($dtm, function ($tcc) use ($svc) {    /** @var Dtmcli\Tcc $tcc */    $req = ['amount' => 30];    $tcc->callBranch($req, $svc . '/TransOutTry', $svc . '/TransOutConfirm', $svc . '/TransOutCancel');    $tcc->callBranch($req, $svc . '/TransInTry', $svc . '/TransInConfirm', $svc . '/TransInCancel');});

至此,一个完整的TCC分布式事务编写完成。

如果您想要完整运行一个成功的示例,那么参考这个例子yedf/dtmcli-php-sample,将它运行起来非常简单

# 部署启动dtm# 需要docker版本18以上git clone https://github.com/yedf/dtmcd dtmdocker-compose up# 另起一个命令行https://github.com/yedf/dtmcli-php-sample.gitcd dtmcli-php-samplecomposer installphp demo.php start


TCC的回滚

假如银行将金额准备转入用户2时,发现用户2的账户异常,返回失败,会怎么样?我们可以让TransIn返回失败来模拟这种情况

$vega->handleFunc('/api/TransInTry', function (Mix\Vega\Context $ctx) {    var_dump('TransInTry', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());    $ctx->JSON(200, ['result' => 'FAILURE']);})->methods('POST');

我们给出事务失败交互的时序图


手把手教你用PHP完成一个分布式事务TCC

这个跟成功的TCC差别就在于,当某个子事务返回失败后,后续就回滚全局事务,调用各个子事务的Cancel操作,保证全局事务全部回滚。

在TCC事务模式上,有不少的读者会问,如果Confirm/Cancel失败会怎么样?这是一个好问题,代表您正在深入思考TCC事务模式。第一种情况是临时失败,例如网络故障、应用或数据库宕机,这类错误进行重试,最后会返回成功;另一种情况为业务失败,按照TCC的协议,第一阶段锁定资源,保证足够的资源能够让Confirm/Cancel执行,也就是说,程序逻辑上,Confirm/Cancel是不允许返回业务失败的,如果出现业务失败,那么是bug,需要开发人员手动修复bug。

小结

在这篇文章里,我们介绍了TCC的理论知识,也通过一个例子,完整给出了编写一个TCC事务的过程,涵盖了正常成功完成,以及成功回滚的情况。相信读者通过这边文章,对TCC已经有了深入的理解。

文中使用的例子节选自yedf/dtm(https://github.com/yedf/dtm),它支持多种事务模式:TCC、SAGA、XA、事务消息 跨语言支持,已支持 golang、python、Java、PHP、nodejs等语言的客户端,参考各语言SDK(https://dtm.pub/summary/code.html#go)。提供子事务屏障功能,优雅解决幂等、悬挂、空补偿等问题。

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 手把手教你用PHP完成一个分布式事务TCC

相关文章

  • 2022-04-29ThinkPHP6中env环境变量的使用
  • 2022-04-29Photoshop制作漂亮的暗红色网页框架
  • 2022-04-29微博运营商对伦敦奥运的精彩赛事的直播是广告
  • 2022-04-29Photoshop制作金属质感的艺术字教程
  • 2022-04-29JS中循环遍历数组的四种方式总结
  • 2022-04-29Photoshop绘制梦幻炫彩效果的艺术字
  • 2022-04-29PHP中子类如何调用父类的静态方法
  • 2022-04-29PHP如何删除Array数组指定key
  • 2022-04-29PHPCMS V9 文章列表循环样式自定义方法
  • 2022-04-29阿里云Composer全量镜像下载配置及常见问题解答

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • 怎样选择合适的关键词去销售产品
    • vue简单实现转盘抽奖
    • 织梦cms二次开发普通会员隐藏/VIP会员显示
    • PhotoShop设计打造品牌艺术字LOGO效果教程
    • php如何替换img中src内容
    • WordPress移除head头部js、css、feed等多余加载项
    • Photoshop制作夹心饼干艺术字效果
    • Photoshop制作洁白的云朵艺术字教程
    • Photoshop制作超强科技感立体艺术字
    • jQuery sibling是什么意思

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有