大事务执行sql 上限

您好,发现一个问题,文档中说大事务5000条sql 是上限,但是我这边测试插入1w的事务都能成功,请问是有上限的嘛?

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

这边的描述应该是 1万条数据,算上索引的话这边的键值对总数应该是没有超过 300,000 的。

  • 单个事务包含的 SQL 语句不超过 5000 条(默认)

这个是有超过5000的,我是单条insert操作,执行1w次,不是批量操作

有显示声明事务么? TiDB 是默认 auto commit 的。 TiDB 使用的默认参数么?

如果声明了的话,麻烦发下截图等信息看下。

我们是有显式声明事务的
10_19_20__08_06_2019

10_20_52__08_06_2019

我们在一个事务里面单条insert了1w次是ok的,是我们的操作姿势不对吗:blush:

事务配置那块我们没有做修改,都是使用的默认配置

嗯. 这边如果是测试集群的话,可以尝试临时打开 general log 来看下执行了的 SQL 。

好的,我们把general_log打开看看,官方有对应的测试例子吗?tidb在做多条insert之前会不会对sql进行合并?

  • 单个事务包含的 SQL 语句不超过 5000 条(默认)

其中的sql有没有什么限制,比如说只针对哪些类型的sql才会纳入count

不会合并的,这边怀疑是 代码框架的操作。

所有单行 SQL 都会纳入 count

你好,刚才我们把general_log打开了,看了下general_log,发现tidb是一条一条插入的

[sql=“INSERT INTO test_order ( id,payment_order_id,merchant_id,merchant_name,agent_id,agent_name,mechanism_id,payment_channel_id,payment_channel_name,payment_center_id,payment_code,mch_create_ip,server_create_ip,terminal_ip,spbill_create_ip,device_info,body,amount,fee_type,refund_amount,pay_time,payment_status,settlement_status,reconciliation_status,return_url,thirdpart_order_id,bank_type,app_id,thirdpart_merchant_no,sub_app_id,open_id,sub_open_id,sub_thirdpart_merchant_no,attach,scene_info,goods_tag,terminal_os,create_time,update_time,out_trade_no,callback_status,callback_url,callback_time,main_merchant_id,channel_group_id ) VALUES( null,‘27cd1117-d10e-466e-8e8c-299844302b60’,‘118801’,‘XXX’,‘118904’,‘AAA’,‘1188’,7,‘ch7’,1,‘trade.weixin.app’,‘’,‘0.0.0.0’,‘’,‘0.0.0.0’,’ ‘,’ ‘,8770941413919638515,‘1’,0,‘2019-08-06 01:16:23.684’,0,1,1,’ ‘,’ ‘,’‘,’‘,’‘,’‘,’‘,’‘,’‘,’‘,’‘,’‘,’‘,‘2019-10-01 11:00:21.1’,‘2019-08-06 01:16:23.684’,‘54630c2d-4390-4784-96ee-62f988b50bcd’,0,’ ‘,‘2019-08-06 01:16:23.684’,’',0 )”]

嗯,如果 general log 中是一行行的,说明代码框架是一条条提交的了。

抓取完毕后不要忘记关闭 general log 这边会有一定的性能影响。

好的,麻烦你们帮忙看看这个问题

这个问题昨天已经给出结论了,在日志里面是逐行提交的,建议咱们这边查下代码逻辑。

这边多次尝试了,现在采用最基本的方案,插入6000条数据,查看general log ,log如下

开始部分

结束部分

描述

  1. 例子是for 循环6000次,来进行插入,结束部分的id能看出来
  2. 在开始执行之前会把SET autocommit=0
  3. 中间没有commit,都是一个全局时钟txnStartTS=410296771674112002
  4. 结束的时候,会执行sql=commit,并且执行SET autocommit=1
从执行的日志来看,中间没有commit,是一个完整的事务,并且超过了5000个sql,
但是没有失败,始终无法复现文档中“单个事务包含的 SQL 语句不超过 5000 条(默认)”的情况

有做过 tidb_batch_insert 设置吗

没有的,还是默认为0

大佬,你们能否提供一个官方的小例子让我们试下呢,我怕我们的操作姿势不对:blush:

测试了下 ,当 insert 到 5000 的时候,已经出现了报错:ERROR 1105 (HY000): statement count 5001 exceeds the transaction limitation, autocommit = false ;写入失败,但是 insert 没有中断,所以真正写入的是 5001 后面的数据。 可以查下表里数据验证。

我们使用的是 5.7.25-TiDB-v3.0.1,我们插入6000条数据没有报错,数据都入库了,大佬能把你的测试例子贴出来看看吗?:grinning:

同样的 3.0.1 版本,开启 autocommit =0 ,insert 6000 条数据,在第 5001 的时候报错,之后 commit 查看数据,之后报错之后的数据写入成功。可以本地直连 DB 测试下。