在 spark2.2 中使用 jdbc 驱动写入 tidb 时出现此错误:
java.sql.BatchUpdateException: transaction too large, len:300200
在条件下得到错误:
select whole table
在条件下没有出错:
select with limit 10000000;
没有任何线索
在 spark2.2 中使用 jdbc 驱动写入 tidb 时出现此错误:
java.sql.BatchUpdateException: transaction too large, len:300200
在条件下得到错误:
select whole table
在条件下没有出错:
select with limit 10000000;
没有任何线索
显示错误消息事务太大。
由于分布式事务需要进行两阶段提交,底层进行 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加循环来操作。