TiDB 最大事务数问题

前置条件

KV entry 表示的是 一行的数据

1 最大事务数是多少?

2 一个事务最大限制是 5000 条SQL, 每条 SQL 10000 个 values?

3 计算方式是什么?

4 数据是由客户上传不能确定单条数据 在6M以内,总大小不超过 100M?

5 set @@session.tidb_batch_insert=1; 的作用是什么?

6 如果一直开启 set @@session.tidb_batch_insert=1;,而程序里面不做分批插入会怎么样?

7 我应该如何合理的 计算最大事务条数

8 例如 表:table_test 1千万数据, 大小 3G 左右, 执行语句更新 1千万数据的 name:

 UPDATE  table_test  SET name;

根据文档所说,是受到了哪一条限制的影响?

9 如果一直开启 set @@session.tidb_batch_insert=1; 一个事务中 保证不超过30W 的限制, 但是 超过单条 KV entry 6M , 也超过 KV entry 的总大小 100MB, 这会怎么样?也会丢失原子性吗?

10 UPDATE 操作时的计算方式 也是与 INSERT 限制一样的对吗?

11 如果不一样,是按照被修改的列计算的 KV entry 大小, 还是计算这一整行的数据大小

12 更新数据 如何限制,更新的数据不能超过100MB

13 DELETE 操作时的计算方式 也是与 INSERT 限制一样的对吗?

1、最大事务数是没有做限制的,只会对单个事务做限制。具体限制详见:https://pingcap.com/docs-cn/dev/faq/tidb/#433-transaction-too-large-是什么原因怎么解决
2、按照这个问题的假设,在没有索引的情况下,5000 * 1W = 5000W ,有一个索引的情况下 是 5000 * 1W * 2 = 10000W 。 单个事务大于 30W kv entry 的限制
3、Google Cloud Spanner 也有类似的限制。TiDB 的限制也是基于测试的最佳实践得出的
4、 建议在应用层进行判断然后拆分
5、可以把大事务超过30W kv entry 的进行分批拆分
6、超过30W 会丢失事务的原子性
7、就是一个事务会影响的 kv entry . 单个事务的影响行数 + 每个索引影响的行数
8、超过了 30W kv entry 的限制。对 delete 和 update 语句,可以使用 limit 加循环的方式进行操作。

  1. 还是会报错,因为现在 session.tidb_batch_insert 只会针对 kv entry 数量进行拆分。
  2. 不是针对某些操作进行限制,是对事务大小进行了限制。
  3. 12 13 计算方式可以参考之前李宋高老师的文章 : TiDB 事务限制详解
1赞