| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> 用 Python 轻松完成一个 TCC 分布式事务,保姆级教程 -> 正文阅读 |
|
[Python知识库]用 Python 轻松完成一个 TCC 分布式事务,保姆级教程 |
TCC分布式事务来源于 2007 年Pat Helland发表的一篇名为《Life beyond Distributed Transactions:an Apostate’s Opinion》的论文,TCC分别是Try、Confirm、Cancel的手写字母。 组成TCC有三个分支
与经典的XA分布式事务一样,Tcc事务也可以分为下面三个角色:
如果我们要进行一个类似于银行跨行转账的业务,转出(TransOut)和转入(TransIn)分别在不同的微服务里,一个成功完成的TCC事务典型的时序图如下: TCC 实践A转账给B的跨行转账操作,如果转账不成功,我们不想让用户看到自己账上的余额变动过,因此我们在Try阶段冻结相关的余额,Confirm阶段进行转账,Cancel阶段进行余额解冻。这样可以避免A看到自己的存款减少了,但是最后转账又失败的情况。 下面是具体的开发详情 我们采用Python语言,使用https://github.com/yedf/dtm这个功能强大又简单易用的分布式事务框架 创建两张表,一个用户余额表,另一个是冻结资金表,语句如下:
trading 表中,trading_balance 记录正在交易的金额。 我们先编写核心代码,冻结 /解冻资金操作,会检查约束 balance+trading_balance >= 0,如果约束不成立,执行失败
然后是调整余额
下面我们来编写具体的 Try/Confirm/Cancel 的处理函数
到此各个子事务的处理函数已经 OK 了,然后是开启 TCC 事务,进行分支调用
至此,一个完整的 TCC 分布式事务编写完成。 如果您想要完整运行一个成功的示例,那么按照 dtmcli-py-sample 项目的说明运行 tcc 的例子即可 TCC 的回滚假如银行将金额准备转入用户 2 时,发现用户 2 的账户异常,返回失败,会怎么样?我们修改代码,模拟这种情况:
这是事务失败交互的时序图? 这个跟成功的 TCC 差别就在于,当某个子事务返回失败后,后续就回滚全局事务,调用各个子事务的 Cancel 操作,保证全局事务全部回滚。 TCC 网络异常TCC 在整个全局事务的过程中,可能发生各类网络异常情况,典型的是空回滚、幂等、悬挂,由于 TCC 的异常情况,和 SAGA 、可靠消息等事务模式有相近的地方,因此我们把所有异常的解决方案统统放在这篇文章分布式事务最经典的七种解决方案的异常处理章节进行讲解 小结在这篇文章里,我们介绍了 TCC 的理论知识,也通过一个例子,完整给出了编写一个 TCC 事务的过程,涵盖了正常成功完成,以及成功回滚的情况。相信读者通过这边文章,对 TCC 已经有了深入的理解。 关于分布式事务更多更全面的知识,请参考分布式事务最经典的七种解决方案 文中使用的例子节选自github.com/yedf/dtm,该框架功能强大又简单易用。
? ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 6:48:28- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |