在使用spark2.2中的tidb使用jdbc驱动时遇到此错误:
java.sql.BatchUpdateException: transaction too large, len:300200
在条件下得到错误:
select whole table
条件下没有错误:
select with limit 10000000;
没有任何线索
答案 0 :(得分:1)
显示错误消息事务太大。
由于分布式事务需要进行两阶段提交和 如果事务非常严重,则底层执行Raft复制 大,提交过程会非常缓慢,以及随后的Raft 因此,复制流程受到了打击。为了避免这个问题,我们限制了 交易规模:
每个键值输入不超过6MB键值的总数 条目不超过300,000行键值输入的总大小 不超过100MB Google Cloud也有类似的限制 扳手。
解决方案:
导入数据时,批量插入,最好保留 10,000行内一批的数量。
对于插入和选择,您可以打开隐藏的参数集 @@ session.tidb_batch_insert = 1;,并且insert将执行大 批量交易。这样,就可以避免造成超时 通过大型交易,但这可能会导致原子性的丧失。一个 执行过程中的错误导致部分插入 交易。因此,仅在必要时使用此参数,并且 在会话中使用它以避免影响其他语句。当。。。的时候 事务完成后,使用set @@ session.tidb_batch_insert = 0来 关闭它。
对于删除和更新,您可以使用限制加循环来 操作