在事务中当语句返回结果集比较大时,语句状态为idle in transaction案例分析

举报
fighttingman 发表于 2022/04/19 08:57:23 2022/04/19
【摘要】 考虑一种场景,在事务中select出很多结果集返回给客户端,客户端拿这些结果做一些操作,比如上传,输出到文件等操作,在数据量比较大的时候执行时间会比较长,这种状态下,语句就会处于idle in transaction的状态,在DWS老版本中这种状态会占用并发数 这种作业比较多的情况下就会造成作业堆积排队的现象。 idle in transaction在pg_stat_activity中的状态解释是

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的状态
节剩了数据库资源。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。