
1. 为什么要在本地折腾 Seata 1.7.0分布式事务这个词听起来像是只有大厂才需要关心的东西但只要你手上跑着两个以上的微服务并且它们各自连着自己的数据库早晚会撞上「订单创建成功、库存扣减失败」这类数据不一致的场面。Seata 就是来解决这个问题的它把跨服务、跨库的事务协调逻辑抽出来让业务代码尽量少感知。1.7.0 这个版本在 Nacos 配置集成和 MySQL 存储脚本上已经比较稳定适合本地搭一套完整环境来练手。这篇内容面向的是在 mac 或 Windows 上做本地开发的同学你可能已经写过几个 Spring Cloud 服务也听过 Nacos但还没把 Seata 真正跑起来过。我会带你从零把 Seata Server 启动起来用 Nacos 同时当配置中心和注册中心事务数据落到 MySQL最后用一个跨服务调用验证整条链路是通的。过程中所有配置文件都会给全你复制粘贴就能用。另外既然本地要跑一堆服务AI 编码工具基本是标配了。我会顺带说下怎么用 TaoToken 的统一 Key 把 Cline、CC Switch 这类工具接进来省得每个工具单独配一遍模型通道。这部分不是重点但对你日常写 Seata 相关代码会有帮助。2. 环境准备与 TaoToken 前置说明2.1 你需要提前装好的东西在 mac 和 Windows 上基础依赖基本一致只是安装方式不同。下面这张表是我实测下来比较省事的组合组件版本建议mac 安装方式Windows 安装方式JDK8 或 11brew install openjdk11官网下载 zip 解压配 PATHMySQL8.0brew install mysql官网 installerNacos2.2.x下载 tar.gz 解压下载 zip 解压Seata1.7.0下载 tar.gz 解压下载 zip 解压JDK 版本这块要注意Seata 1.7.0 用 JDK 8 和 11 都没问题但如果你本机默认是 JDK 17启动脚本可能会报模块相关的错。我建议单独切一个 11 的环境来跑 Seata Server省得排查半天。Nacos 和 Seata 都建议下载官方 release 包不要用 Docker 镜像图省事因为本地调试时你需要频繁改配置文件直接改解压目录里的文件更直观。2.2 TaoToken 在这里扮演什么角色TaoToken 是一个统一的模型 API 通道你可以把它理解成「一个 Key 走通多个 AI 工具」。官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。为什么搭 Seata 环境要提它因为你在写 Seata 的配置类、排查 Nacos 注册失败、改 application.yml 的时候如果有个顺手的 AI 编码助手效率会高很多。Cline 和 CC Switch 都支持自定义 API 地址你把 TaoToken 的 Key 填进去就能在编辑器里直接问「Seata 的 undo_log 表建对了吗」这种问题不用来回切浏览器。拿 Key 的路径是登录后进控制台在 API Keys 页面创建一个新 Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API Keys 页面是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。创建完复制出来后面配 Cline 会用到。如果你只是想先验证模型通不通可以直接用模型对话页面试一句https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。长期写代码的话Coding Plan 会更划算地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。3. Nacos 与 MySQL 的可复制配置3.1 启动 Nacos 并确认端口先把 Nacos 跑起来。mac 下进到解压目录执行sh bin/startup.sh -m standaloneWindows 下用 cmdbin\startup.cmd -m standalone启动后访问 http://127.0.0.1:8848/nacos 默认账号密码都是 nacos。能进控制台就说明 Nacos 没问题。这里用 standalone 模式就够了本地不需要集群。3.2 建 Seata 需要的数据库和表Seata Server 需要三张表global_table、branch_table、lock_table。在 MySQL 里新建一个库比如叫 seata然后执行下面这段 SQLCREATE DATABASE IF NOT EXISTS seata DEFAULT CHARSET utf8mb4; USE seata; CREATE TABLE IF NOT EXISTS global_table ( xid VARCHAR(128) NOT NULL, transaction_id BIGINT, status TINYINT NOT NULL, application_id VARCHAR(32), transaction_service_group VARCHAR(32), transaction_name VARCHAR(128), timeout INT, begin_time BIGINT, application_data VARCHAR(2000), gmt_create DATETIME, gmt_modified DATETIME, PRIMARY KEY (xid), KEY idx_gmt_modified_status (gmt_modified, status), KEY idx_transaction_id (transaction_id) ) ENGINE InnoDB DEFAULT CHARSET utf8mb4; CREATE TABLE IF NOT EXISTS branch_table ( branch_id BIGINT NOT NULL, xid VARCHAR(128) NOT NULL, transaction_id BIGINT, resource_group_id VARCHAR(32), resource_id VARCHAR(256), branch_type VARCHAR(8), status TINYINT, client_id VARCHAR(64), application_data VARCHAR(2000), gmt_create DATETIME, gmt_modified DATETIME, PRIMARY KEY (branch_id), KEY idx_xid (xid) ) ENGINE InnoDB DEFAULT CHARSET utf8mb4; CREATE TABLE IF NOT EXISTS lock_table ( row_key VARCHAR(128) NOT NULL, xid VARCHAR(96), transaction_id BIGINT, branch_id BIGINT, resource_id VARCHAR(256), table_name VARCHAR(32), pk VARCHAR(36), status TINYINT NOT NULL DEFAULT 0, gmt_create DATETIME, gmt_modified DATETIME, PRIMARY KEY (row_key) ) ENGINE InnoDB DEFAULT CHARSET utf8mb4;这三张表是 Seata Server 存全局事务、分支事务和锁信息的业务库那边还需要单独建 undo_log 表后面讲业务服务时再说。3.3 把配置推到 NacosSeata 1.7.0 支持从 Nacos 读配置这样你改参数不用动本地文件。在 Nacos 控制台新建一个配置Data ID 填 seataServer.propertiesGroup 填 SEATA_GROUP格式选 Properties。内容如下transport.typeTCP transport.serverNIO transport.heartbeattrue transport.enableClientBatchSendRequestfalse transport.threadFactory.bossThreadPrefixNettyBoss transport.threadFactory.workerThreadPrefixNettyServerNIOWorker transport.threadFactory.serverExecutorThreadPrefixNettyServerBizHandler transport.threadFactory.shareBossWorkerfalse transport.threadFactory.clientSelectorThreadPrefixNettyClientSelector transport.threadFactory.clientSelectorThreadSize1 transport.threadFactory.clientWorkerThreadPrefixNettyClientWorkerThread transport.threadFactory.bossThreadSize1 transport.threadFactory.workerThreadSizedefault transport.shutdown.wait3 service.vgroupMapping.my_test_tx_groupdefault service.default.grouplist127.0.0.1:8091 service.enableDegradefalse service.disableGlobalTransactionfalse store.modedb store.db.datasourcedruid store.db.dbTypemysql store.db.driverClassNamecom.mysql.cj.jdbc.Driver store.db.urljdbc:mysql://127.0.0.1:3306/seata?useUnicodetruerewriteBatchedStatementstrueserverTimezoneAsia/Shanghai store.db.userroot store.db.password你的MySQL密码 store.db.minConn5 store.db.maxConn30 store.db.globalTableglobal_table store.db.branchTablebranch_table store.db.lockTablelock_table store.db.queryLimit100 store.db.maxWait5000注意 service.vgroupMapping.my_test_tx_groupdefault 这一行my_test_tx_group 是事务分组名业务服务里要跟它对齐否则会报找不到事务分组。4. Seata Server 的启动配置与验证4.1 改 registry.conf 指向 Nacos进到 Seata 解压目录的 conf 文件夹编辑 registry.conf。这个文件决定 Seata Server 去哪注册、去哪读配置。内容改成registry { type nacos nacos { application seata-server serverAddr 127.0.0.1:8848 group SEATA_GROUP namespace cluster default username nacos password nacos } } config { type nacos nacos { serverAddr 127.0.0.1:8848 namespace group SEATA_GROUP username nacos password nacos dataId seataServer.properties } }这里 registry 和 config 都指向 NacosdataId 就是上一步建的配置名。namespace 留空表示用 public 命名空间本地开发够用了。4.2 启动 Seata Servermac 下sh bin/seata-server.sh -p 8091 -m dbWindows 下bin\seata-server.bat -p 8091 -m db-p 指定端口-m db 表示存储模式是数据库。启动日志里如果看到「Server started, listen port: 8091」就说明成功了。这时候去 Nacos 的服务列表看应该能看到一个叫 seata-server 的服务分组是 SEATA_GROUP。如果启动报连不上 MySQL先检查 store.db.url 里的 IP 和库名再确认 MySQL 允许本地连接。Windows 上还有个常见坑是防火墙拦了 8091 端口本地调试可以先临时关掉防火墙验证。4.3 用 TaoToken 接入 Cline 做辅助排查Seata 启动失败时日志往往很长这时候可以用 Cline 帮你读日志。在 Cline 的设置里API Provider 选 OpenAI CompatibleBase URL 填 https://taotoken.net/api API Key 填你在控制台创建的那个。模型名按 TaoToken 文档里给的填。配好之后把 Seata 的启动日志贴进 Cline 对话框问「这个报错是什么原因」它会帮你定位到具体配置项。CC Switch 的配法类似也是填同一个 Base URL 和 Key具体可以看接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。如果你用 Claude Code接入地址是 https://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。5. 业务服务接入与跨服务事务验证5.1 业务库建 undo_log 表每个参与事务的业务库都要建 undo_log 表这是 Seata AT 模式回滚用的CREATE TABLE IF NOT EXISTS undo_log ( 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, UNIQUE KEY ux_undo_log (xid, branch_id) ) ENGINE InnoDB AUTO_INCREMENT 1 DEFAULT CHARSET utf8mb4;5.2 业务服务的 application.yml假设你有 order-service 和 stock-service 两个服务它们的 Seata 配置基本一样spring: application: name: order-service datasource: url: jdbc:mysql://127.0.0.1:3306/order_db?serverTimezoneAsia/Shanghai username: root password: 你的密码 driver-class-name: com.mysql.cj.jdbc.Driver seata: enabled: true application-id: order-service tx-service-group: my_test_tx_group service: vgroup-mapping: my_test_tx_group: default registry: type: nacos nacos: server-addr: 127.0.0.1:8848 group: SEATA_GROUP username: nacos password: nacos config: type: nacos nacos: server-addr: 127.0.0.1:8848 group: SEATA_GROUP >GlobalTransactional(name create-order, rollbackFor Exception.class) public void createOrder(Order order) { orderMapper.insert(order); stockClient.deduct(order.getProductId(), order.getCount()); }stock-service 的扣减方法正常写加 Transactional 即可。启动两个服务后调一次创建订单接口。如果库存不足stock-service 抛异常你会看到 order-service 的订单记录被回滚global_table 里那条事务状态变成 Rollbacked。这就说明整条链路通了。验证时可以查一下 seata 库的 global_table事务提交后会有记录再查业务库的 undo_log回滚后数据会被清理。这两个表的状态能帮你判断事务到底走到哪一步了。6. 本篇常见报错排查报错一no available service default found这个基本是事务分组没对上。检查业务服务里的 tx-service-group 和 Nacos 配置里的 service.vgroupMapping 是否一致再看 Seata Server 有没有成功注册到 Nacos。如果 Nacos 服务列表里没有 seata-server回去看 registry.conf 的 serverAddr 和 group。报错二Could not connect to MySQL先确认 MySQL 服务在跑再用命令行连一下 seata 库。如果命令行能连、Seata 连不上多半是 store.db.url 里的参数问题比如少了 serverTimezone 或者 useSSL 没关。Windows 上还要注意密码里如果有特殊字符在 properties 文件里可能需要转义。报错三undo_log table not found业务库忘了建 undo_log 表。每个参与事务的库都要建不是只在 seata 库建。建完重启业务服务即可。报错四Nacos 配置读取失败检查 dataId 是否和 registry.conf 里写的一致Group 是否是 SEATA_GROUP。如果 Nacos 开了鉴权username 和 password 要填对。本地默认是 nacos/nacos改过密码的话记得同步。报错五Seata Server 启动后端口被占用8091 被别的进程占了。用 lsof -i:8091mac或 netstat -ano | findstr 8091Windows查一下换个端口启动同时业务服务的 default.grouplist 也要跟着改。排查这些错的时候如果日志太长看不明白可以把关键片段丢给 Cline 或模型对话页面问一下比纯靠搜索引擎快。模型对话入口在 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。7. 把 AI 工具链接入日常开发流Seata 环境搭好之后你日常改配置、写事务代码、看日志的频率会很高。与其每次手动翻文档不如把 TaoToken 的 Key 配到常用工具里。Cline 适合在编辑器里直接改代码CC Switch 适合快速切换模型通道Claude Code 适合在终端里做批量操作。统一 Key 的好处是你不用每个工具单独申请账号一个 Key 走通所有通道。API 地址统一用 https://taotoken.net/api Key 在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 创建。长期写代码的话Coding Plan 的额度更划算地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。我自己的习惯是Seata 启动报错先看日志看不懂就贴给 Cline配置项记不清就问模型对话批量改多个服务的 yml 就用 Claude Code。这套组合跑下来本地调试分布式事务的效率比纯手动高不少。