近日,多位用户反馈在升级至 OceanBase 4.3.3 版本后,使用 MyBatis 框架进行批量插入操作时,若目标表包含 VSAG 向量索引,会频繁抛出事务超时异常。该问题引发了社区广泛关注,尤其是在需要处理大规模向量数据的 AI 应用、推荐系统和知识图谱场景中,影响尤为显著。
问题现象:批量插入时事务一致性被打破
据用户描述,典型场景如下:开发者在 OceanBase 4.3.3 中创建了一张包含 VSAG 向量索引的表,例如用于存储商品特征向量的 product_vectors 表。当通过 MyBatis 的 SqlSession 执行批量 insert(如使用 INSERT INTO table VALUES (...), (...)... 或 MyBatis Batch Executor)时,事务提交阶段抛出 Transaction timeout 异常,回滚导致插入失败。部分用户尝试手动调整 ob_trx_timeout 参数,但即便将超时时间延长至 120 秒,问题仍未完全消除。
进一步测试发现,若移除该表的 VSAG 索引,或用传统 B-tree 索引替代,批量插入操作正常。这一现象清晰指出:问题与 VSAG 向量索引在写入时的维护机制 直接相关。
根本原因:索引构建带宽与事务锁争用
OceanBase 4.3.3 引入的 VSAG(Vector Similarity Aggregation)索引,是一种专为高维向量相似性搜索设计的新型索引结构。其写入过程需要同步更新聚类中心、倒排列表等多级数据结构,计算开销远高于传统索引。在批量插入场景下,每一行数据的新增都会触发 VSAG 索引的增量重组,导致事务内 DML 操作耗时急剧上升。
此外,OceanBase 采用 MVCC + 乐观锁 的事务模型,批量操作可能引发多个分区的索引页锁竞争。当单事务内的累积耗时超过 ob_trx_timeout 默认值(通常为 30 秒)时,数据库会强制中断事务,并抛出超时异常。MyBatis 的批量模式倾向于将多条 INSERT 合并为一次网络请求,但在数据库侧,这些操作仍属于同一事务,无法通过简单分批发送来规避内部的索引计算瓶颈。
影响范围:从业务系统到开发流程
目前该问题主要波及以下群体:
- 生产运维人员:在包含向量索引的大表上执行数据批量导入时,必须暂停索引或采用非常规手段,影响上线效率。
- Java 后端开发者:MyBatis 是 Spring Boot 项目中最常见的持久层框架,批量插入超时会导致接口响应变慢,甚至触发客户端重试风暴。
- 向量数据库迁移用户:部分从 Milvus、Pinecone 等专用向量数据库迁移至 OceanBase 的用户,期望利用其分布式事务能力,但此问题降低了混合事务与分析处理(HTAP)场景的可用性。
官方回应与临时解决方案
OceanBase 官方在社区 issue 中已确认此行为,并指出核心在于 VSAG 索引在事务内的增量构建未做充分的耗时管控。目前推荐以下临时方案:
- 调整事务超时参数:将
ob_trx_timeout提升至 120 秒以上,或设置ob_trx_idle_timeout为更长值。注意此方法仅缓解症状,一旦数据量级增大仍可能超时。 - 拆分批量粒度:将 MyBatis 的
ExecutorType.BATCH改为SIMPLE,手动控制每次 INSERT 数量(如每 500 条提交一次),降低单事务负载。 - 先禁索引后重建:在批量插入前执行
ALTER TABLE ... ALTER INDEX ... UNUSABLE,待数据全部插入后再重建 VSAG 索引。此方法适合离线导入场景。 - 回退版本:若环境允许,可临时降级至 OceanBase 4.3.2 或 4.2.x 系列,但会丧失 VSAG 索引带来的查询性能优势。
专家提醒:向量索引的运维哲学
有多年 OceanBase 运维经验的社区专家指出,向量索引与标量索引有本质区别——VSAG 的写放大因子可达 10 倍以上。建议用户在规划表结构时,对小批量高频写入的表谨慎启用 VSAG 索引;对于大批量导入场景,优先采用 “先批量加载再异步构建索引” 的设计模式,而非依赖事务内的同步更新。
OceanBase 官方表示,将在 4.3.4 或后续补丁版本中优化 VSAG 索引的增量刷盘逻辑,引入写入缓存队列以降低事务内耗时,预计于 2025 年 Q2 发布。在此期间,用户可通过上述临时方案保证业务连续性。
提示:本文涉及的参数调优方法请先在测试环境验证。OceanBase 官方社区已开设专项讨论帖(ID: OB-4305-VSAG),用户可获取最新 Hotfix 信息。