Skip to content

[Bug] JDBC 外部驱动连接多行删除报 cannot provide a rollbackable transaction(方言被推断为 H2 后绕过 jdbc 覆盖) #12657

Open

Description

@DongZY0617

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

intarkdb,DBX 版本 0.6.47

问题描述 / Problem description

复现步骤

  1. 打开该 JDBC 连接的表数据网格
  2. 多选若干行(100 行左右)→ 删除
  3. 点击提交
    实际:The active backend cannot provide a rollbackable transaction for a batch; run without use_transaction.
    期望:与 MySQL 连接一致,多行删除一次提交成功;或至少自动降级为非事务批量(executeBatch),不要直接失败。
    同一操作在 MySQL 连接上正常,说明不是数据本身的问题。
    根因
    链路自后端向前:
  4. 核心对外部驱动连接池没有 batch_transaction_path,use_transaction = true 的批处理会被直接拒绝(错误文案即出自这里)。
  5. 前端是否走事务由 useDataGridEditor.ts 的 useTransaction 决定:
    const useTransaction = computed(() =>
    editable.value &&
    supportsDataGridTransaction(resolvedDatabaseType.value) &&
    (!!customSaveHandler?.value || hasBackendSaveTarget.value)
    );
  6. supportsDataGridTransaction()(lib/table/tableEditing.ts:52)只读 getDatabaseCapability(databaseType).tableData.transaction。
  7. databaseTableDataCapabilities.ts 里 jdbc 已显式覆盖为 transaction: false,本应生效。
  8. 但 resolvedDatabaseType 不是原始的 jdbc,而是 effectiveDatabaseTypeForConnection() → inferJdbcDialect() 推断出的方言。推断时会把以下字段拼成 haystack 做正则匹配:driver_profile、driver_label、connection_string、jdbc_driver_class、jdbc_driver_paths、database_info.productName、serverComment、driverName。
  9. 该驱动沿用了 H2 的实现,DatabaseMetaData.getDatabaseProductName() 返回 H2,命中规则 { type: "h2", patterns: [/jdbc:h2:/i, /\bh2\b/i] },于是方言被推断为 h2。
  10. h2 在能力表里属 Navicat 风格,transaction: true → useTransaction = true → 走 executeInTransaction → 被核心拒绝。
    即:连接本身是外部 JDBC 驱动(无事务批路径),但方言推断成 H2 后,jdbc 的 transaction: false 覆盖被绕过。
    参考:DuckDB 的同类报错([Bug] DuckDB 表格批量单元格编辑提交时报错:cannot provide a rollbackable transaction for a batch #12306 / fix(duckdb): save data grid batch edits non-transactionally (#12306) #12342)通过给 duckdb 加能力覆盖修复;该修法对"方言被推断成具体库"的 JDBC 连接不生效。

驱动唯一"异常"是 getDatabaseProductName() 仍报 H2(沿用 H2 实现),这也是方言被误判的来源;但把它改成真实库名会让方言回落到通用 jdbc,从而丢掉 H2 方言下的表结构编辑能力,因此修复应落在客户端的能力判断上。

支持信息 / Support information

环境

  • DBX 0.6.47,Windows 11 x64
  • 连接类型:JDBC(自定义驱动),db_type = jdbc
  • JDBC URL:jdbc:intarkdb:tcp://:9001?dbname=
  • 驱动类:com.best.tools.intarkdb.jdbc.IntarkDbFixDriver(包装厂商驱动,事务能力与原生驱动一致)

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

🔴 P0 紧急 · 下个版本必须修 / Urgent · Must fix next release

补充信息 / Additional information

No response

Activity

  1. dbx-bot commented on Oct 19, 2026

    @dbx-bot

    以下 Issue 可能与当前问题相关:

    这些结果由机器人自动检索,尚未确认重复。如属于同一问题,建议在已有 Issue 中补充信息。

  2. Tong-bit-art commented on Oct 19, 2026

    @Tong-bit-art
    Contributor

    关联线索:本问题的核心侧正解与 #12026 同源——该 PR 把 PoolKind::ExternalDriver 从 BatchTransactionPath::Unsupported 改为走驱动的 beginManualTransaction/commitManualTransaction 协议(Fixes #11990,CI 全绿)。合并后外部驱动(含本单中 getDatabaseProductName() 报 H2、方言被推断为 h2 的情况)的批处理事务应可直接提交;前端对应的 jdbc 能力项可在其后评估是否恢复 transaction: true。`

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workinguser-priority/P0User-reported priority: urgent

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions