单语句事务写入Reference Table失败:子聚合器为何无法执行?
问题:子节点执行单语句事务写入Reference Table失败的原因
我在数据库客户端手动执行单语句事务时触发如下错误:
WARN com.singlestore.jdbc.message.server.ErrorPacket - Error: 2549-HY000: Writing to a reference table in multi-statement transaction is not permitted on child aggregators. Try the command again on the master aggregator.
执行的SQL语句:
begin work; insert into test_table (test_column) values ('data'); commit;
建表语句:
create rowstore reference table test_table ( test_column varchar(100), primary key (test_column) using btree );
为何在子节点执行单语句事务写入Reference Table也无法正常工作?
原因分析与解决方案
- 事务判定规则:你以为这是单语句事务,但显式用
begin work;和commit;包裹的操作,会被SingleStore判定为多语句事务——哪怕中间只有一条DML语句。而子聚合器(子节点)本身就不允许在多语句事务中写入Reference Table,这是产品的硬性限制。 - Reference Table的写入约束:Reference Table是全局同步的表,所有写入操作必须由主聚合器(master aggregator)协调执行,才能保证数据在所有节点的一致性。子聚合器只负责处理读请求和部分分布式写请求,没有权限处理涉及Reference Table的多语句事务。
- 可行的解决办法:
- 直接执行单条
insert语句(去掉显式的begin和commit),这种情况SingleStore会把它当成自动提交的单语句事务,子节点可以正常处理。 - 如果必须用显式事务,切换到主聚合器执行该操作。
- 直接执行单条
内容的提问来源于stack exchange,提问作者Artur Kovalchuk
相关产品推荐
相关产品推荐

