在事务中当语句返回结果集比较大时,语句状态为idle in transaction案例分析
【摘要】 考虑一种场景,在事务中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)