第一次执行update语句可以,第二次就报错

为提高效率,提问时请尽量提供详细背景信息,问题描述清晰可优先响应。以下信息点请尽量提供:

  • 系统版本 & kernel 版本】 centos7
  • TiDB 版本】 3.05
  • 磁盘型号
  • 集群节点分布】 2tidb,3pd 5tikv
  • 数据量 & region 数量 & 副本数】 400w
  • 问题描述(我做了什么)】 第一次执行update语句可以 update request_keyword_task set status=0 where status!=0 LIMIT 100000; [SQL]update request_keyword_task set status=0 where status!=0 LIMIT 100000; 受影响的行: 100000 时间: 4.683s

第二次执行报错 update request_keyword_task set status=0 where status!=0 LIMIT 100000; [SQL]update request_keyword_task set status=0 where status!=0 LIMIT 100000; [Err] 8004 - transaction too large, len:400001

  • 关键词

在 tidb 中对事务有一定的限制:

  • 单个事务包含的 SQL 语句不超过 5000 条(默认)
  • 每个键值对不超过 6MB
  • 键值对的总数不超过 300,000
  • 键值对的总大小不超过 100MB

如果不满足这个要求,这会出现相关报错。

上面提到的虽然是同一条 sql 语句,但是影响的数据可能是不一样的,出现了不满足事务要求的问题,建议拆分 sql 后重试下~~~

我能不能不用事务啊

如果是通过 tidb server 使用,则一定会使用事务,如果只是使用 tikv server 不使用 tidb server,可以使用事务接口或者 kv 接口

tikv 接口?这个到没有听说过,tidb server 不就是解析 sql用的么,tikv是存储数据的

是的,如果只是将 tikv 作为 key-value 的存储(而不部署 tidb server ),那么提供了 kv 和事务接口

所以 我连接kv的接口 可以正常使用sql语句么?

如果是使用 tidb-server + tikv-server + pd-server 是通过 sql 语句使用的话,需要使用事务接口。如果是指使用 key-value 存储,不使用 tidb-server ,那么可以使用 kv 接口。

所以 我要想使用sql语句 就必须要通过 tidb-server

@zhenjiaogao-PingCAP 确认一下, 事务大小限制是 tidb-server 里的限制,不是 tikv 的限制吧? 所以,用 tispark 最新的写入功能,是可以突破事务大小的限制的吧?

目前有两种将计算结果写回 TiKV 的方法:

  1. 所有 TiSpark 版本均支持 TiSpark 通过 JDBC 接口接 TiDB 做写入,这时候与 TiSpark 无关,是由 Spark 和 JDBC 实现的。这种写入方法会受到 TiDB 自身的事务大小限制,并且是单点写入。https://github.com/pingcap/tispark/blob/master/docs/userguide.md#load-spark-dataframe-into-tidb-using-jdbc
  2. TiSpark 发布 2.2.0 版本后,已经支持使用分布式写入,直接写回 TiKV。此方案兼容 Spark 的 DataSourceAPI。文档见 https://github.com/pingcap/tispark/blob/master/docs/userguide.md#load-spark-dataframe-into-tidb-using-tidb-connector

收到,谢了:+1: