news 2026/5/8 22:20:22

Go语言分布式事务:TCC模式实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Go语言分布式事务:TCC模式实战

Go语言分布式事务:TCC模式实战

1. TCC模式概述

TCC(Try-Confirm-Cancel)是一种常用的分布式事务解决方案,将业务逻辑拆分为三个阶段:

  • Try:预留资源,锁定事务
  • Confirm:确认执行,使用预留资源
  • Cancel:取消执行,释放预留资源

2. TCC框架实现

type TCCContext struct { TryTasks []TryTask ConfirmTasks []ConfirmTask CancelTasks []CancelTask } type TryTask func(ctx context.Context) error type ConfirmTask func(ctx context.Context) error type CancelTask func(ctx context.Context) error type TCCService struct { transactions map[string]*TCCContext mu sync.RWMutex } func (s *TCCService) Register(id string, try TryTask, confirm ConfirmTask, cancel CancelTask) { s.mu.Lock() defer s.mu.Unlock() s.transactions[id] = &TCCContext{ TryTasks: []TryTask{try}, ConfirmTasks: []ConfirmTask{confirm}, CancelTasks: []CancelTask{cancel}, } } func (s *TCCService) Execute(ctx context.Context, id string) error { s.mu.RLock() tx, ok := s.transactions[id] s.mu.RUnlock() if !ok { return errors.New("transaction not found") } for _, try := range tx.TryTasks { if err := try(ctx); err != nil { s.rollback(ctx, tx) return err } } for _, confirm := range tx.ConfirmTasks { if err := confirm(ctx); err != nil { s.rollback(ctx, tx) return err } } return nil } func (s *TCCService) rollback(ctx context.Context, tx *TCCContext) { for _, cancel := range tx.CancelTasks { cancel(ctx) } }

3. 实战示例

func Transfer(from, to string, amount int64) error { tccService := NewTCCService() tccService.Register("transfer", func(ctx context.Context) error { return FreezeAccount(ctx, from, amount) }, func(ctx context.Context) error { return ConfirmTransfer(ctx, from, to, amount) }, func(ctx context.Context) error { return UnfreezeAccount(ctx, from, amount) }, ) return tccService.Execute(context.Background(), "transfer") }

4. 总结

TCC模式通过将分布式事务拆分为三个阶段,结合业务层面的补偿逻辑,实现了柔性事务的最终一致性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 22:19:16

《刺客信条:影》风灵月影修改器下载(已汉化)2026最新版分享

本文讲述了忍者与武士在乱世中的传奇故事。游戏将系列标志性的潜行、跑酷与开放世界探索,融入战国时代的独特背景,打造了兼具历史氛围与动作爽感的游玩体验。但同时,资源管理的压力、技能养成的周期和部分战斗的高难度,也让部分玩…

作者头像 李华
网站建设 2026/5/8 22:15:00

基于通用库的Helm Charts仓库:自托管服务K8s部署实践

1. 项目概述:一个为自建服务量身定制的Helm Charts仓库 如果你正在Kubernetes上折腾各种自托管服务,大概率已经体会过“找Chart”的烦恼:官方仓库的版本可能太旧,社区维护的又良莠不齐,配置项要么过于复杂&#xff0c…

作者头像 李华
网站建设 2026/5/8 22:14:59

激光雷达:智慧城市的硬核 “感知之眼”

说起智慧城市,大家最先想到的是智能红绿灯、高清监控、城市数字大屏,可很少有人知道,激雷雷达才是支撑城市智慧化的核心硬件,是默默守护城市运转的隐形感知中枢。 传统单摄像头只能捕捉二维画面,遇到黑夜、强光逆光等场…

作者头像 李华
网站建设 2026/5/8 22:14:36

山西GEO公司怎么选?看这5点避坑指南

在 AI 搜索成为用户获取信息主要入口的今天,山西做 GEO 已成为企业品牌建设的刚需。但面对市场上层出不穷的服务商,如何选择靠谱的合作伙伴?我跟踪山西本地市场 3 年,结合 6500 企业的实际反馈,总结了这份 5 点避坑指南…

作者头像 李华
网站建设 2026/5/8 22:13:35

第七章 供水科学调度的智能调度

1. 供水调度技术发展的三个阶段 1.1 供水调度技术发展可分为三个阶段: 供水科学调度系统的发展历程可以分为三个阶段:人工调度、科学调度和智能调度。 在第一个阶段,即人工调度阶段,系统主要依靠调度员的经验和技能进行供水调度。由于供水系统的规模和复杂性越来越大,人工…

作者头像 李华
网站建设 2026/5/8 22:12:47

如何在Navicat中使用导出数据库完整数据字典_架构师必备技能

Navicat无法一键导出完整数据字典,需手动执行information_schema查询组合表结构、字段注释、索引及外键信息,再导出为Excel/CSV;注意字符集设为utf8mb4并选UTF-8编码,避免注释乱码或为空。导出 MySQL 数据库的完整数据字典&#x…

作者头像 李华