[BUG] bugs detected by doubao
✅ 验证清单
- [x] 🔍 我已经搜索过 现有 Issues,确信这不是重复问题
🚀 Go 版本
1.23
📦 Seata-go 版本
latest
💾 操作系统
🪟 Windows
📝 Bug 描述
要检测 incubator-seata-go 系统的潜在缺陷(含代码 bug),需结合历史修复记录(反映高频问题领域)和当前代码片段(暴露出现有风险)两方面分析,具体如下:
一、从历史修复记录看高频缺陷领域(潜在遗留风险)
从各版本 changes 文档的 bugfix 记录可知,以下系统在以下模块存在高频问题,需警惕后续类似场景的潜在风险:
1. 事务核心模块(AT/XA 模式)
- 高频问题类型:
- AT 模式:undo log 生成/解析错误(如 #359 插入 undo log bug、#690 Jackson 解析器未找到、#509 SQLType 字段错误)、回滚逻辑异常(#368 回滚示例 bug、#672 AT 回滚 bug)、数据校验缺失(#366 新增回滚前校验)。
- XA 模式:初始化 panic(#540)、提交/回滚失败(#562 提交 panic、#674 XA 回滚 bug)、数据库版本兼容性(#545 获取 DB 版本 bug)。
- 潜在遗留风险:
- 复杂 SQL 场景(如子查询、特殊函数、JSON/空间类型)的 undo log 生成仍可能遗漏;
- XA 模式在数据库断连、网络超时场景下的事务状态一致性(如悬挂事务、空回滚)未完全覆盖;
- AT 模式的“数据校验-回滚”原子性不足,极端情况下可能出现脏回滚。
2. 通信与连接管理(Getty 组件)
- 高频问题类型:
- Getty 初始化失败(#423、#424)、Session 自动关闭(#130)、心跳消息内存泄漏(#665 未回收 heartbeat response)。
- 潜在遗留风险:
- 分布式环境下网络闪断时,Getty 重连逻辑可能存在重试风暴或死锁;
- 远程调用的
future对象未及时释放,仍可能引发内存泄漏(如非心跳类响应消息); - Session 关闭时资源(如连接、缓冲区)释放不彻底,导致文件句柄泄漏。
3. SQL 解析与处理
- 高频问题类型:
- 特殊 SQL 语法支持不足(#724 缺失括号表达式、#780 TEXT 类型解码失败、#771 INSERT ON DUPLICATE UPDATE 大小写不匹配);
- SQL 语句未正确关闭(#736)、表名大小写导致 lowkey 不一致(#781)。
- 潜在遗留风险:
- 对非 MySQL 数据库(如 PostgreSQL、Oracle)的方言支持不完善(如特殊数据类型、语法关键字);
- 复杂 SQL(如多表关联、嵌套子查询)的表名/字段提取错误,导致锁冲突或 undo log 无效。
4. 配置与初始化
- 高频问题类型:
- undo log 配置文件加载错误(#418)、RM/TM 初始化流程混乱(#390 优化 RM 初始化)、全局事务上下文丢失(#472)。
- 潜在遗留风险:
- 配置项依赖顺序错误(如事务超时时间在初始化后加载,导致生效延迟);
- 多数据源场景下,RM 注册重复或资源绑定错误;
- 全局事务上下文(如
Context)在 goroutine 切换时未正确传递(如异步回调中丢失)。
5. 并发与测试
- 高频问题类型:
- 数据竞争(#326 fanout 测试竞争)、循环递归(#387 OpenConnector 死循环)、单元测试覆盖不足(#176 单测 bug)。
- 潜在遗留风险:
- 共享资源(如配置缓存、连接池)未加锁,高并发下出现数据竞争;
- 测试用例未覆盖“异常场景”(如网络超时、数据库宕机),导致线上隐藏 bug。
二、当前代码片段中的显性潜在 bug
从提供的代码文件片段中,可直接识别出以下未处理的风险点:
1. 事务提交忽略 beforeCommit 返回值(XA/AT 模式)
- 代码位置:
pkg/datasource/sql/tx_xa.go(XA 事务 Commit):func (tx *XATx) Commit() error { tx.tx.beforeCommit() // 未检查返回值 return tx.commitOnXA() }pkg/datasource/sql/tx_at.go(AT 事务 Commit):func (tx *ATTx) Commit() error { tx.tx.beforeCommit() // 未检查返回值 return tx.commitOnAT() }
- 问题描述:
beforeCommit通常用于事务提交前的准备操作(如资源锁定、undo log 预检查),若其返回错误(如资源不足、检查失败),当前代码会直接忽略并继续执行commitOnXA/AT,导致事务状态不一致(如未准备完成却强制提交,引发脏数据)。 - 影响范围:XA/AT 模式下的事务提交可靠性。
2. SQL 解析遗漏 AST 节点类型(AT 模式执行器)
- 代码位置:
pkg/datasource/sql/exec/at/base_executor.go的traversalArgs方法:func (b *baseExecutor) traversalArgs(node ast.Node, argsIndex *[]int32) { if node == nil { return } switch node.(type) { // 仅处理 5 种 AST 节点类型,遗漏大量其他类型 case *ast.BinaryOperationExpr: /* ... */ case *ast.BetweenExpr: /* ... */ case *ast.PatternInExpr: /* ... */ case *ast.Join: /* ... */ case *test_driver.ParamMarkerExpr: /* ... */ // 未处理:UnaryExpr、FunctionCallExpr、SubqueryExpr 等 } } - 问题描述:
该方法用于收集 SQL 中的参数索引(供 undo log 生成使用),但仅处理了 5 种 AST 节点类型。若 SQL 中包含未覆盖的节点类型(如
SELECT ABS(?)中的UnaryExpr、SELECT NOW()中的FunctionCallExpr),会导致argsIndex收集不完整,进而引发:- 参数绑定错误(如少传/错传参数);
- undo log 生成异常(如无法还原原始数据)。
- 影响范围:AT 模式下含复杂表达式的 SQL 执行。
3. 日志模块缺乏错误自处理(util/log)
- 代码位置:
pkg/util/log/logging.go的Error函数:func Error(v ...interface{}) { if log == nil { return } log.Error(v...) // 未处理 log.Error 自身的 panic } - 问题描述:
虽然检查了
log是否为 nil,但未处理log.Error调用时可能发生的 panic(如log实例内部状态异常)。若log组件自身故障,会导致调用log.Error的业务逻辑(如事务失败回滚)崩溃,加剧故障影响。 - 影响范围:全链路日志记录的可靠性,间接影响事务异常处理。
4. SQLHook 接口未定义错误处理规范(exec/hook)
- 代码位置:
pkg/datasource/sql/exec/hook.go的SQLHook接口:type SQLHook interface { Type() types.SQLType Before(ctx context.Context, execCtx *types.ExecContext) error After(ctx context.Context, execCtx *types.ExecContext) error } - 问题描述:
接口定义了
Before/After方法的错误返回,但未明确错误处理逻辑规范(如:Before返回错误时是否中断 SQL 执行?After错误是否需要重试?)。不同SQLHook实现可能对错误处理不一致,导致:- 安全钩子(如 SQL 黑白名单)失效(如
Before报错却继续执行危险 SQL); - 事务钩子(如日志记录)异常时,事务状态不可追溯。
- 安全钩子(如 SQL 黑白名单)失效(如
- 影响范围:依赖
SQLHook的扩展功能(如安全控制、审计日志)。
三、建议的风险排查与修复方向
-
事务核心模块:
- 补充复杂 SQL(子查询、特殊类型)的 undo log 生成测试;
- 完善 XA 模式的“断连重试”“状态回查”逻辑,避免悬挂事务。
-
Getty 通信:
- 检查所有远程调用的
future对象是否及时回收,避免内存泄漏; - 增加 Session 异常关闭的监控告警(如文件句柄数、连接数)。
- 检查所有远程调用的
-
SQL 解析:
- 补充 AST 节点类型覆盖(如
UnaryExpr、SubqueryExpr),并增加单元测试; - 适配多数据库方言,增加 PostgreSQL/Oracle 的兼容性测试。
- 补充 AST 节点类型覆盖(如
-
代码缺陷修复:
- 为
tx_xa.go/tx_at.go的beforeCommit增加错误判断:if err := tx.tx.beforeCommit(); err != nil { return err } - 为
base_executor.go的traversalArgs补充未覆盖的 AST 节点处理; - 为
log.Error增加defer recover()防护,避免日志故障扩散。
- 为
-
测试覆盖:
- 补充高并发场景的压力测试(如 10k+ TPS 下的数据竞争检测);
- 完善异常场景测试(网络超时、数据库宕机、配置错误)。
🔄 重现步骤
finded by doubao
✅ 预期行为
fix those errors
❌ 实际行为
nothing
💡 可能的解决方案
No response
è¡¥å ï¼Seata-go README.md æ ¸å¿ç¼ºå¤±æ¨¡åä¸å®å建议
åºäºç°æ README.md å 容ï¼ç»ååå¸å¼äºå¡æ¡æ¶çç¨æ·ä½¿ç¨åºæ¯ä¸ææ¡£è§èæ§ï¼å¯è¡¥å 以ä¸å ³é®ä¿¡æ¯ï¼å¸®å©ç¨æ·æ´å ¨é¢ç解项ç®ãéä½ä¸æææ¬å¹¶è§é¿å¸¸è§é®é¢ï¼
ä¸ãæ ¸å¿åè½ï¼æ¯æçäºå¡æ¨¡å¼è¯´æ
ç°æææ¡£ä» æå TM/RM/TC è§è²ï¼æªæç¡® Seata-go æ¯æçäºå¡æ¨¡å¼ï¼åå¸å¼äºå¡æ ¸å¿ç¹æ§ï¼ï¼éè¡¥å æ¯ç§æ¨¡å¼çéç¨åºæ¯ä¸æ ¸å¿é»è¾ï¼
1. æ¯æçäºå¡æ¨¡å¼
Seata-go å¯¹é½ Seata-Java æ ¸å¿è½åï¼ç®åæ¯æä»¥ä¸4ç§ä¸»æµåå¸å¼äºå¡æ¨¡å¼ï¼æ»¡è¶³ä¸åä¸å¡åºæ¯éæ±ï¼
| äºå¡æ¨¡å¼ | æ ¸å¿åç | éç¨åºæ¯ | ä¼å¿ | 注æäºé¡¹ |
|---|---|---|---|---|
| AT 模å¼ï¼Automatic Transactionï¼ | åºäº SQL è§£æèªå¨çæ undo/redo logï¼æ ä¾µå ¥å¼äºå¡æ§å¶ï¼ä¸¤é¶æ®µæäº¤ï¼ä¸é¶æ®µæ¬å°æäº¤+äºé¶æ®µå¼æ¥ç¡®è®¤/è¡¥å¿åæ»ï¼ | éä¾µå ¥å¼éæ±ãSQL æä½åºæ¯ï¼å¦çµå订å-åºå-æ¯ä»é¾è·¯ï¼ | å¼åæ æç¥ãæ§è½ä¼ãéé 主æµå ³ç³»åæ°æ®åºï¼MySQL ä¼å ï¼ | éå建 undo_log 表ï¼è§ä¸æé ç½®ï¼ã䏿¯æé SQL æä½ |
| XA æ¨¡å¼ | åºäºæ°æ®åºåç XA åè®®ï¼å¼ºä¸è´æ§äºå¡ï¼ä¸é¶æ®µåå¤+äºé¶æ®µæäº¤/åæ»ï¼ | 强ä¸è´æ§éæ±ã夿°æ®åºè·¨åºäºå¡ï¼å¦éèæ ¸å¿ä¸å¡ï¼ | å®å ¨éµå¾ª ACIDãæ°æ®åºåçæ¯æ | æ§è½è¾å¼±ï¼é¿äºå¡éå®èµæºï¼ãéæ°æ®åºæ¯æ XA åè®® |
| TCC 模å¼ï¼Try-Confirm-Cancelï¼ | ä¸å¡å±æå¨å®ä¹ Tryï¼èµæºæ£æ¥/é¢çï¼ãConfirmï¼ç¡®è®¤æ§è¡ï¼ãCancelï¼è¡¥å¿åæ»ï¼ä¸é¶æ®µæ¥å£ | é SQL æä½åºæ¯ï¼å¦è°ç¨ç¬¬ä¸æ¹ APIãç¼åæ´æ°ï¼ | çµæ´»æ§é«ãæ éé»å¡ | å¼åä¾µå ¥å¼å¼ºãéæå¨å¤çå¹çä¸ç©ºåæ» |
| SAGA æ¨¡å¼ | åºäºç¶ææºçé¿äºå¡è§£å³æ¹æ¡ï¼æåäºå¡ä¸ºå¤ä¸ªæ¬å°äºå¡èç¹ï¼å¤±è´¥æ¶æéåºè°ç¨è¡¥å¿èç¹ | é¿äºå¡åºæ¯ï¼å¦è·¨å¤©è®¢åå¤çãç©æµç¶ææµè½¬ï¼ | æ¯æè¶ é¿äºå¡ãä½èµæºå ç¨ | æç»ä¸è´æ§ãéæå¨è®¾è®¡è¡¥å¿é»è¾ |
äºãç¯å¢ä¾èµä¸åç½®æ¡ä»¶
ç°æâå¦ä½è¿è¡âä»
æä¾ go get å½ä»¤ï¼ç¼ºå°ç¯å¢ä¾èµè¯´æï¼ç¨æ·æå çæ¬ä¸å
¼å®¹æåç½®é
置缺失导è´å¯å¨å¤±è´¥ï¼
1. åºç¡ç¯å¢è¦æ±
- Go çæ¬ï¼æä½è¦æ± Go 1.18+ï¼ä¾èµæ³åãæ¨¡åç¹æ§ï¼ï¼æ¨è Go 1.20+ 以ä¿éæ§è½ä¸å ¼å®¹æ§ï¼
- TC æå¡å¨ï¼éé¨ç½² Seata æå¡å¨ï¼TC è§è²ï¼ï¼çæ¬å
¼å®¹æ§å¦ä¸ï¼
- Seata-go v2.0.0 å ¼å®¹ Seata-Java TC v1.7.x / v2.0.xï¼
- ä½äº Seata-go v1.6.0 çæ¬éå¹é Seata-Java TC v1.5.x å以ä¸ï¼
- æ°æ®åºæ¯æï¼
- 主æµå ³ç³»åæ°æ®åºï¼MySQL 5.7+ / 8.0+ï¼AT/XA 模å¼ä¼å æ¯æï¼ï¼
- å®éªæ§æ¯æï¼PostgreSQL 12+ï¼éæå¨éé æ¹è¨é ç½®ï¼ï¼
- æä¸æ¯æ NoSQL æ°æ®åºï¼å¦ RedisãMongoDBï¼ã
2. åç½®é ç½®ï¼å¿ åæ¥éª¤ï¼
ï¼1ï¼å建 undo_log 表ï¼AT 模å¼å¿ å¡«ï¼
AT 模å¼éå¨ä¸å¡æ°æ®åºä¸å建 undo_log 表ï¼ç¨äºåå¨äºå¡åæ»æ¥å¿ï¼ï¼SQL è¯å¥å¦ä¸ï¼ä»¥ MySQL 为ä¾ï¼ï¼
CREATE TABLE `undo_log` (
`id` bigint NOT NULL AUTO_INCREMENT,
`branch_id` bigint NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
ï¼2ï¼TC æå¡å¨é ç½®
éç¡®ä¿ TC æå¡å¨å·²å¯å¨ï¼å¹¶é
ç½® registry.confï¼æ³¨åä¸å¿ï¼ä¸ file.confï¼äºå¡å卿¨¡å¼ï¼ï¼ç¤ºä¾ï¼
- 注åä¸å¿ï¼æ¯æ Nacos / Eureka / ZooKeeperï¼å¦ Nacos é
ç½®ï¼
registry { type = "nacos" nacos { serverAddr = "127.0.0.1:8848" namespace = "" group = "SEATA_GROUP" } } - äºå¡åå¨ï¼æ¯æ DB / Redis / Fileï¼ç产ç¯å¢æ¨è DB åå¨ã
ä¸ãå¿«éå¼å§ï¼æç®ä»£ç 示ä¾
ç°æææ¡£å¼å¯¼ç¨æ·åå¾ samples ä»åºï¼ä½ README ä¸å å ¥æç®ç¤ºä¾å¯è®©ç¨æ·å¿«éçè§£æ ¸å¿ç¨æ³ï¼ä»¥ AT 模å¼ä¸ºä¾ï¼ï¼
1. æ¥éª¤1ï¼åå§åå ¨å±äºå¡é ç½®
å¨é¡¹ç®å¯å¨æ¶åå§å Seata é
ç½®ï¼å¦ main.goï¼ï¼
package main
import (
"github.com/apache/incubator-seata-go/pkg/client"
"github.com/apache/incubator-seata-go/pkg/conf"
)
func init() {
// 1. é
ç½® TC å°åï¼æéè¿é
ç½®æä»¶å è½½ï¼
conf.Load(conf.WithFile("seata-config.yaml"))
// 2. åå§å Seata 客æ·ç«¯ï¼TM + RMï¼
if err := client.Init(); err != nil {
panic("seata client init failed: " + err.Error())
}
}
2. æ¥éª¤2ï¼å®ä¹å ¨å±äºå¡ï¼TM è§è²ï¼
å¨ä¸å¡å ¥å£å½æ°ä¸å¼å¯å ¨å±äºå¡ï¼å 裹å¤ä¸ªå¾®æå¡è°ç¨ï¼
import (
"context"
"github.com/apache/incubator-seata-go/pkg/tm"
)
// å
¨å±äºå¡å
¥å£ï¼å建订å -> æ£ååºå -> æ£åä½é¢
func CreateOrder(ctx context.Context) error {
// 1. å¼å¯å
¨å±äºå¡ï¼çæ XID å¹¶èªå¨ä¼ æï¼
globalTx, err := tm.BeginTx(ctx, tm.WithTimeout(60*1000)) // äºå¡è¶
æ¶ 60s
if err != nil {
return err
}
defer func() {
// 3. å
¨å±äºå¡æäº¤/åæ»ï¼æ ¹æ®ä¸å¡ç»æï¼
if err != nil {
_ = tm.RollbackTx(globalTx)
} else {
_ = tm.CommitTx(globalTx)
}
}()
// 2. è°ç¨åå¾®æå¡ï¼XID ä¼éè¿ Context èªå¨ä¼ æï¼
if err = orderService.CreateOrder(globalTx, orderDTO); err != nil {
return err
}
if err = stockService.DeductStock(globalTx, stockDTO); err != nil {
return err
}
if err = accountService.DeductBalance(globalTx, accountDTO); err != nil {
return err
}
return nil
}
3. æ¥éª¤3ï¼æ¬å°äºå¡æ¥å ¥ï¼RM è§è²ï¼
å¨å¾®æå¡çæ¬å°æ°æ®åºæä½ä¸ï¼éè¿ Seata å è£ äºå¡ï¼
import (
"context"
"github.com/apache/incubator-seata-go/pkg/datasource/sql"
)
// æ£ååºåï¼æ¬å°äºå¡ï¼èªå¨æ³¨åä¸ºåæ¯äºå¡ï¼
func (s *StockService) DeductStock(ctx context.Context, dto StockDTO) error {
// ä½¿ç¨ Seata å
è£
ç DB è¿æ¥ï¼èªå¨å
³èå
¨å±äºå¡
db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/stock_db")
if err != nil {
return err
}
defer db.Close()
// æ¬å° SQL æä½ï¼èªå¨çæ undo logï¼åä¸å
¨å±äºå¡ï¼
_, err = db.ExecContext(ctx,
"UPDATE stock SET count = count - ? WHERE product_id = ? AND count >= ?",
dto.DeductNum, dto.ProductID, dto.DeductNum,
)
return err
}
åãå ³é®é 置项说æ
è¡¥å
æ ¸å¿é
ç½®æä»¶ï¼å¦ seata-config.yamlï¼çå
³é®åæ°ï¼å¸®å©ç¨æ·å¿«ééé
ç¯å¢ï¼
seata:
client:
tm:
rollback-retry-count: 3 # å
¨å±åæ»éè¯æ¬¡æ°
commit-retry-count: 3 # å
¨å±æäº¤éè¯æ¬¡æ°
timeout: 60000 # å
¨å±äºå¡è¶
æ¶æ¶é´ï¼msï¼
rm:
report-retry-count: 5 # 忝äºå¡ç¶æä¸æ¥éè¯æ¬¡æ°
table-meta-check-enable: true # æ¯å¦å¼å¯è¡¨ç»æèªå¨æ£æ¥ï¼AT 模å¼ï¼
lock:
retry-count: 3 # éå²çªéè¯æ¬¡æ°
retry-interval: 1000 # éå²çªéè¯é´éï¼msï¼
service:
vgroup-mapping:
my_test_tx_group: default # äºå¡åç»ä¸ TC é群æ å°ï¼éä¸ TC é
ç½®ä¸è´ï¼
grouplist:
default: 127.0.0.1:8091 # TC æå¡å¨å°åï¼å¤ä¸ªç¨éå·åéï¼
transport:
type: tcp # éä¿¡åè®®ï¼é»è®¤ TCPï¼
server: nio # TC é信模å¼ï¼NIOï¼
heartbeat: true # æ¯å¦å¼å¯å¿è·³æ£æµ
äºã常è§é®é¢ï¼FAQï¼
è¡¥å ç¨æ·åæ¬¡ä½¿ç¨æ¶é«é¢éå°çé®é¢åè§£å³æ¹æ¡ï¼åå°ææ¥ææ¬ï¼
1. Qï¼XID æªä¼ æå°ä¸æ¸¸æå¡ï¼å¯¼è´åæ¯äºå¡æªæ³¨åï¼
Aï¼éç¡®ä¿ä»¥ä¸ä¸¤ç¹ï¼
- 䏿¸¸æå¡è°ç¨æ¶ï¼å¿
é¡»éè¿
context.Contextä¼ éï¼Seata-go åºäº Context æºå¸¦ XIDï¼ï¼ - é¿å
ä½¿ç¨ goroutine 弿¥è°ç¨ï¼éæå¨éè¿
tm.TransferTx(ctx)ä¼ éä¸ä¸æï¼ã
2. Qï¼AT 模å¼ä¸æ¥éâundo_log 表ä¸åå¨âï¼
Aï¼é卿æä¸å¡æ°æ®åºä¸å建 undo_log 表ï¼è§ä¸æ SQLï¼ï¼ä¸è¡¨ç»æä¸æ°æ®åºçæ¬å¹é ï¼å¦ MySQL 8.0 éæ³¨æå符é为 utf8mb4ï¼ã
3. Qï¼TC è¿æ¥è¶ æ¶ï¼æ¥éâconnect to 127.0.0.1:8091 failedâï¼
Aï¼æ£æ¥ï¼
- TC æå¡å¨æ¯å¦å·²å¯å¨ï¼ä¸ç«¯å£ 8091 æªè¢«å ç¨ï¼
- é
ç½®æä»¶ä¸
seata.service.grouplistä¸ TC å®é å°åä¸è´ï¼ - ç½ç»é²ç«å¢æ¯å¦å¼æ¾ TC 端å£ã
4. Qï¼TCC 模å¼ä¸åºç°âç©ºåæ»âï¼Cancel è°ç¨æ¶æ å¯¹åº Try è®°å½ï¼ï¼
Aï¼éå¨ Cancel æ¥å£ä¸å¢å âå¹çæ ¡éªâï¼éè¿ XID + BranchID æ¥è¯¢æ¬å°äºå¡ç¶æï¼è¥æªæ§è¡ Try åç´æ¥è¿åæåã
å ãçæ¬å ¼å®¹æ§è¯´æ
æç¡®çæ¬å¹é å ³ç³»ï¼é¿å å çæ¬ä¸å ¼å®¹å¯¼è´åè½å¼å¸¸ï¼
| Seata-go çæ¬ | å ¼å®¹ Seata-Java TC çæ¬ | æä½ Go çæ¬ | 主è¦ç¹æ§ |
|---|---|---|---|
| v2.0.0 | v1.7.x / v2.0.x | Go 1.18+ | æ°å¢ SAGA 模å¼ãä¼å AT æ¨¡å¼æ§è½ |
| v1.6.0 | v1.5.x / v1.6.x | Go 1.16+ | å®å XA 模å¼ãæ¯æ PostgreSQL å®éªæ§éé |
| v1.0.0 | v1.4.x | Go 1.14+ | åºç¡ AT/TCC 模å¼ãMySQL æ¯æ |
注æï¼è·¨å¤§çæ¬ä½¿ç¨æ¶ï¼å¦ Seata-go v2.0.0 å¯¹æ¥ TC v1.4.xï¼å¯è½åå¨å ¼å®¹æ§é®é¢ï¼å»ºè®®ä¼å 使ç¨åå¤§çæ¬ç TC æå¡å¨ã
ä¸ãæ§è½ä¼åä¸çæ§å»ºè®®
è¡¥å ç产ç¯å¢ä¼åç¹ä¸çæ§æ¹æ¡ï¼æ»¡è¶³é«å¯ç¨éæ±ï¼
1. æ§è½ä¼å建议
- è¿æ¥æ± é
ç½®ï¼å¢å¤§æ°æ®åºè¿æ¥æ± ï¼å¦
maxOpenConns: 100ï¼ï¼é¿å AT 模å¼ä¸ undo log åå ¥é»å¡ï¼ - æ¹éæä½ï¼å¯¹é«é¢å°äºå¡ï¼å¦æ¹é订åå建ï¼ï¼å»ºè®®åå¹¶ä¸ºåæ¬¡å ¨å±äºå¡ï¼åå° TC äº¤äºæ¬¡æ°ï¼
- éä¼åï¼AT 模å¼ä¸é¿å é¿äºå¡ï¼è¶ æ¶æ¶é´å»ºè®®ä¸è¶ è¿ 30sï¼ï¼åå°è¡éå ç¨æ¶é´ã
2. çæ§éæ
Seata-go æ¯ææ¥å ¥ Prometheus + Grafana çæ§ï¼æ ¸å¿ææ å æ¬ï¼
- å
¨å±äºå¡æ»æ°/æåæ°/失败æ°ï¼
seata_global_transaction_totalï¼ï¼ - 忝äºå¡æ³¨åæ°/æäº¤æ°/åæ»æ°ï¼
seata_branch_transaction_totalï¼ï¼ - äºå¡å¹³åèæ¶ï¼
seata_transaction_duration_secondsï¼ã
é
ç½®æ¹å¼ï¼å¨ seata-config.yaml ä¸å¯ç¨çæ§ï¼
seata:
metrics:
enabled: true
type: prometheus
prometheus:
port: 9898 # Prometheus æ´é²ç«¯å£
å «ãçæå·¥å ·ä¸èµæº
è¡¥å Seata-go ç¸å ³çæå·¥å ·ï¼å¸®å©ç¨æ·æåå¼åæçï¼
- 代ç çæå·¥å ·ï¼Seata-go æä¾ TCC æ¥å£ä»£ç çææä»¶ï¼seata-go-tcc-generatorï¼ï¼èªå¨çæ Try/Confirm/Cancel 模æ¿ä»£ç ï¼
- è¯æå·¥å
·ï¼æ¯æ Seata è¯æå½ä»¤ï¼å¦
seata-cliï¼ï¼å¯æ¥è¯¢å ¨å±äºå¡ç¶æãæå¨æ¸ çå¼å¸¸ undo logï¼ - IDE æä»¶ï¼IntelliJ IDEA æä»¶ï¼Seata Pluginï¼æ¯æäºå¡æ³¨è§£è¯å«ãé ç½®æä»¶é«äº®ã
please assign to me~
Hi, I want to fix some issues related to the getty component.