大事务执行sql 上限

set autocommit = 0;
begin;
INSERT INTO t_test (name)VALUES(‘238’);
INSERT INTO t_test (name)VALUES(‘238’);
//此处省略6141行
INSERT INTO t_test (name)VALUES(‘238’);
COMMIT;
set autocommit = 1;
select count(1) from t_test;

No errors, 1 row affected, taking 21.4ms

111111111A933C980-A972-4B00-8C83-7E90D5F96EC5

6144条插入成功了

tidb.yml 里面这个参数确认是 stmt-count-limit: 5000 这样的吗?

我们没有修改那个默认配置的,我刚才看了下,我们的tidb.toml中的stmt-count-limit 为5000
000017_26_25__08_07_2019

我这边测试,确认5000条限制。

能把你的测试脚本发给我一份吗?

不需要什么脚本 ,设置 autocommit =0 之后,同一个session 写入 5000+ 数据,在 commit ,自然就有结果。

我们看了是因为我们开了悲观锁的问题,我们使用乐观锁后单个事务超过5000条sql会报错,悲观锁下面的stmt_count_limit 是没有限制吗?

确认没有,行为跟乐观锁一致。

你好,大事务里面有一条是

  • 键值对的总数不超过 300,000

我建了如下一张表

CREATE TABLE t_test` (

id bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘id’,

name varchar(20) NOT NULL COMMENT ‘姓名’,

create_time timestamp DEFAULT CURRENT_TIMESTAMP,

PRIMARY KEY (id),

KEY idx_name (name),

KEY idx_ncreate_time (create_time),

UNIQUE KEY uni_idx_name (name)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=2001357
COMMENT=‘test’;`

我插入75001条记录就会报

Cause: java.sql.SQLException: transaction too large, len:300001

请问我们的30w的限制如果转换成记录条数或者说affected rows是这样算的吗:

record_count_limit = 30w / (1+index的个数)

1 个赞

在TiDB里面,每一行数据会是一个KV记录,每一个索引也是一个KV记录。 你的表结构有3个索引,所以每插入一行数据,实际会有4个KV记录。 75000 * 4 = 300000. 所以在插入75001条数据的时候就超过了限制。

1 个赞

嗯嗯,大事务的限制你们有什么应对方案吗(尽量减少对现有的逻辑的改动的)?

你算的没错

当事务提交发生写入冲突时,乐观锁可以进行事务的重试。需要重试的语句在重试前都要保存在 TiDB server 中,如果事务语句太多,会对 TiDB server 造成很大负担,所以,我们设置了 5000 这个语句条数限制。 开启悲观锁后,因为事务不会出现写入冲突错误,提交几乎必定成功。所以,我们对于它去掉了事务中语句条数的限制。 关于大事务限制,我们将会在 4.0 中,去掉 30 万 kv 的限制,并将事务大小限制从 100 MB 提升至 10 GB。对于没有开启重试的乐观事务,也将去掉 5000 行语句的限制。4.0 大概在年底发布。

赶紧啊 兄弟 我们现在的场景都是大事务操作,其实我们是不用事务的 就是都是这种 几百万 几千万数据 update 或者 delete这种的

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。