0

在 spark2.2 中使用 jdbc 驱动写入 tidb 时出现此错误:

java.sql.BatchUpdateException: transaction too large, len:300200

在条件下得到错误:
select whole table

在条件下没有出错:
select with limit 10000000;

没有任何线索

4

1 回答 1

1

TiDB 文档中复制

显示错误消息事务太大。

由于分布式事务需要进行两阶段提交,底层进行 Raft 复制,如果一个事务非常大,提交过程会很慢,从而触发后续的 Raft 复制流程。为了避免这个问题,我们限制了事务大小:

每个 Key-Value 条目不超过 6MB Key-Value 条目的总数不超过 300,000 行 Key-Value 条目的总大小不超过 100MB Google Cloud Spanner 也有类似的限制。

解决方案:

导入数据时,分批插入,一批数最好控制在10000行以内。

至于insert和select,可以打开隐藏参数集@@session.tidb_batch_insert=1;,insert会批量执行大事务。这样可以避免大事务造成的超时,但这可能会导致原子性的丢失。执行过程中的错误导致部分插入事务。因此,仅在必要时使用该参数,并在 session 中使用,以免影响其他语句。事务完成后,使用 set @@session.tidb_batch_insert=0 关闭它。

至于删除和更新,可以使用limit加循环来操作。

于 2017-10-27T15:26:36.250 回答