Tidb数据库报错:Transaction too large

时间:2024-12-25 19:35:02

Tidb是一个支持ACID的分布式数据库,当你导入一个非常大的数据集时,这时候产生的事务相当严重,并且Tidb本身对事物的大小也是有一个严格的控制。

有事务大小的限制主要在于 TiKV 的实现用了一致性协议。对于任何一个分布式数据库,如果你要用一致性协议去做这种复制,肯定要避免非常大的事务。所以这个问题不是 TiDB 的问题。

那大概就会报这样的错误:

9500:Transaction too large

意思就是说由于分布式事务要做两阶段提交,并且底层还需要做 Raft 复制,如果一个事务非常大,会使得提交过程非常慢,并且会卡住下面的 Raft 复制流程。为了避免系统出现被卡住的情况,我们对事务的大小做了限制,这是tidb官方解释。

  • 单条 KV entry 不超过 6MB
  • KV entry 的总条数不超过 30w
  • KV entry 的总大小不超过 100MB

解决方法就是:

set @@tidb_batch_insert =ON
set @@tidb_batch_delete = ON

把这两项打开就行了。

事实上,最好的解决方法就是使用limit来进行导入数据,你可以选择编写一个循环来执行。

给大家看看tidb官方的说明方法

Tidb数据库报错:Transaction too large