在事务中当语句返回结果集比较大时,语句状态为idle in transaction案例分析
idle in transaction状态的解读参考https://bbs.huaweicloud.com/blogs/324347
考虑一种业务场景,启动一个事务,执行select作业,筛选出大量的结果集,提交一个事务,这样对数据库造成什么样的影响呢?
首先这个作业结果集的处理是在一个事务里边,这样就会造成语句的状态变成idle in transaction状态,这种状态在老版本中会占用并发数,如果结果集处理的时间过长的话,占用并发数很长时间,导致别的作业执行不了,阻塞业务运行。
解决的办法如下:
1)首先可以进行分页查询,不要语句一次返回太多的结果集,处理之后及时提交事务
可以使用显示的开启事务,提交事务的方式确保在一次分页查询中,事务提交。
分页查询的语法
select * from jobs order by task_id desc limit (page-1)*m,m
说明:
limit是分页查询关键字
page表示当前是在第几页
m表示查询条数
例1:查询前3个job的信息:
select * from jobs order by task_id desc limit 0,3;
select * from jobs order by task_id desc limit 1,3;
2)DWS支持使用copy query语法,将结果集输出到文件中,可以指定输出的文件格式。先将大量的结果集输出到文件,之后业务程序可以对文件进行遍历处理。这样就可以保证数据库在输出完结果集之后事务及时提交,避免数据库处于idle in transaction的状态
节剩了数据库资源。
- 点赞
- 收藏
- 关注作者
评论(0)