#9546·dbx

[Feature] MCP 固定会话支持跨调用事务控制与逐步结果返回

Author: xcstatusCreated Sep 18, 2026Updated Sep 18, 2026
Labelsenhancementdb/mysqluser-priority/P2ai-priority/P2

数据库类型和版本 / Database type and version

通用 MCP 能力;首个验收场景为 MySQL Community Server 5.7.38 / InnoDB / REPEATABLE READ

支持信息 / Support information

DBX Desktop 0.6.14,macOS。 通过现有 DBX MCP 工具实测:dbx_open_session、dbx_execute_query、dbx_execute_batch。 已确认可打开两个具有不同 CONNECTION_ID() 的固定会话。系统架构未单独采集;以上为实际核验信息。

当前痛点 / Current pain point

需要通过 MCP 自动验证真实数据库的并发幂等、唯一键竞争和 REPEATABLE READ 下的 locking current read。固定连接已经可用,但在会话内执行 START TRANSACTION / ROLLBACK 返回 SQL_BLOCKED: Transaction statements are not supported by MCP.

现有 use_transaction=true 能原子执行一次批次,但不能与 session_id 组合,并只返回合并事务结果。因此无法用现有接口分步协调两个事务,在一个事务等待锁时提交另一个事务,并检查竞争失败一方继续读取到的结果。

这使得自动化验证需要另行配置数据库客户端/连接,而无法复用 DBX 中已有的连接与权限。

期望方案 / Proposed solution

希望在显式启用且驱动支持的固定 MCP 会话上,提供受控的跨调用事务生命周期。可以采用专门的事务工具或结构化操作,具体 API 由维护者确定,不建议仅删除事务 SQL 拦截。

建议最小范围:

  1. 支持显式开始、提交、回滚事务;事务始终绑定原物理连接。
  2. 事务内每次查询返回自己的结果集、错误及事务状态。SQL 错误后的状态按数据库真实语义报告,例如 MySQL duplicate-key 后事务仍可继续查询。
  3. 同一会话操作串行化,不同会话可并行;一个会话等待锁不能阻塞另一会话提交。
  4. 关闭会话、租期到期、取消、断线具有明确清理与回滚语义;无法确认提交结果时报告 unknown,不静默重连或重放写入。
  5. 保留数据库范围、只读、生产库保护及已有授权约束;MySQL 会隐式提交的 DDL 明确拒绝或单独处理;不支持的驱动返回明确能力错误,不降级为自动提交。
  6. 保持现有无状态查询与 use_transaction 批次行为兼容。

验收场景(可在隔离测试库完成):

  • B 开始 RR 事务并先查询不存在的键,建立旧快照。
  • A 开始事务并插入该键,保持未提交。
  • B 尝试插入相同唯一键,真实等待 A。
  • A 提交;B 收到 duplicate-key 错误。
  • B 在同一事务使用 SELECT ... FOR UPDATE 读取到 A 的 winner,核验具体返回值,最后回滚/关闭。
  • 补充提交/回滚、会话隔离、超时/关闭释放锁、断线和权限拒绝的验证。

优先级(是否紧急) / Priority (urgency)

P2 普通 · 按排期处理 / Normal · Schedule as appropriate

补充信息 / Additional information

关联:

  • #4757 已明确指出“会话内事务支持(在固定连接上 BEGIN/COMMIT)是自然的下一步”,当时为控制 PR 范围而未实现。
  • #7817 提供单次调用的 rollbackable transaction batch,本需求是跨调用事务生命周期。
  • #9147 讨论批量执行及结果反馈问题,可关联但范围不完全相同。

建议先以 MySQL 实现和验证最小闭环,其他驱动显式声明能力。数据库范围解析误拦属于另一类问题,不纳入本功能申请。