PG 锁冲突案例

这篇具有很好参考价值的文章主要介绍了PG 锁冲突案例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

用户反馈环境中 update 语句无法正常执行, 执行会卡住

定位分析

采用德哥经典锁冲突 SQL ,查看了下, 结果如下

Pid: 39521                                                                                                                                              
Lock_Granted: true , Mode: ExclusiveLock , FastPath: false , VirtualTransaction: 21/273 , Session_State: idle in transaction                            
Username: mtpoccphopr , Database: testdb , Client_Addr: 192.168.0.100/32 , Client_Port: 55979 , Application_Name: PostgreSQL JDBC Driver              
Xact_Start: 2023-08-31 18:09:42.404895+08 , Query_Start: 2023-08-31 18:29:29.616356+08 , Xact_Elapse: 00:29:53.317839 , Query_Elapse: 00:10:06.106378   
SQL (Current SQL in Transaction):                                                                                                                       
select * from testa where id=1;
--------                                                                                                                                                
Pid: 90924                                                                                                                                              
Lock_Granted: false , Mode: ShareLock , FastPath: false , VirtualTransaction: 24/29 , Session_State: active                                             
Username: pub_test , Database: testdb , Client_Addr: 192.168.0.100/32 , Client_Port: 33246 , Application_Name: DBeaver 7.3.1 - SQLEditor <Script-29.sq
Xact_Start: 2023-08-31 18:38:39.098571+08 , Query_Start: 2023-08-31 18:38:39.098856+08 , Xact_Elapse: 00:00:56.624163 , Query_Elapse: 00:00:56.623878   
SQL (Current SQL in Transaction):                                                                                                                       
update testb set name='xxx' where id=1;

可以看到 Application Name : 为 PostgreSQL JDBC Driver , 说明是应用层的连接, 而查看 当前 SQL 是一个 select 语句, 与 update 语句不会冲突, 这个事务状态处于"idle in transaction"状态, 所以推测是这个没有及时提交的事务代码块中存在 某个 SQL 与
后面 被堵塞的 update 语句冲突, 只不过当前事务最后运行的是一个 select 查询语句, 但是没有及时提交文章来源地址https://www.toymoban.com/news/detail-686719.html

解决方法:

select pg_terminate_backend(39521);

德哥经典锁冲突 SQL 如下

with    
t_wait as    
(    
  select a.mode,a.locktype,a.database,a.relation,a.page,a.tuple,a.classid,a.granted,   
  a.objid,a.objsubid,a.pid,a.virtualtransaction,a.virtualxid,a.transactionid,a.fastpath,    
  b.state,b.query,b.xact_start,b.query_start,b.usename,b.datname,b.client_addr,b.client_port,b.application_name   
    from pg_locks a,pg_stat_activity b where a.pid=b.pid and not a.granted   
),   
t_run as   
(   
  select a.mode,a.locktype,a.database,a.relation,a.page,a.tuple,a.classid,a.granted,   
  a.objid,a.objsubid,a.pid,a.virtualtransaction,a.virtualxid,a.transactionid,a.fastpath,   
  b.state,b.query,b.xact_start,b.query_start,b.usename,b.datname,b.client_addr,b.client_port,b.application_name   
    from pg_locks a,pg_stat_activity b where a.pid=b.pid and a.granted   
),   
t_overlap as   
(   
  select r.* from t_wait w join t_run r on   
  (   
    r.locktype is not distinct from w.locktype and   
    r.database is not distinct from w.database and   
    r.relation is not distinct from w.relation and   
    r.page is not distinct from w.page and   
    r.tuple is not distinct from w.tuple and   
    r.virtualxid is not distinct from w.virtualxid and   
    r.transactionid is not distinct from w.transactionid and   
    r.classid is not distinct from w.classid and   
    r.objid is not distinct from w.objid and   
    r.objsubid is not distinct from w.objsubid and   
    r.pid <> w.pid   
  )    
),    
t_unionall as    
(    
  select r.* from t_overlap r    
  union all    
  select w.* from t_wait w    
)    
select locktype,datname,relation::regclass,page,tuple,virtualxid,transactionid::text,classid::regclass,objid,objsubid,   
string_agg(   
'Pid: '||case when pid is null then 'NULL' else pid::text end||chr(10)||   
'Lock_Granted: '||case when granted is null then 'NULL' else granted::text end||' , Mode: '||case when mode is null then 'NULL' else mode::text end||' , FastPath: '||case when fastpath is null then 'NULL' else fastpath::text end||' , VirtualTransaction: '||case when virtualtransaction is null then 'NULL' else virtualtransaction::text end||' , Session_State: '||case when state is null then 'NULL' else state::text end||chr(10)||   
'Username: '||case when usename is null then 'NULL' else usename::text end||' , Database: '||case when datname is null then 'NULL' else datname::text end||' , Client_Addr: '||case when client_addr is null then 'NULL' else client_addr::text end||' , Client_Port: '||case when client_port is null then 'NULL' else client_port::text end||' , Application_Name: '||case when application_name is null then 'NULL' else application_name::text end||chr(10)||    
'Xact_Start: '||case when xact_start is null then 'NULL' else xact_start::text end||' , Query_Start: '||case when query_start is null then 'NULL' else query_start::text end||' , Xact_Elapse: '||case when (now()-xact_start) is null then 'NULL' else (now()-xact_start)::text end||' , Query_Elapse: '||case when (now()-query_start) is null then 'NULL' else (now()-query_start)::text end||chr(10)||    
'SQL (Current SQL in Transaction): '||chr(10)||  
case when query is null then 'NULL' else query::text end,    
chr(10)||'--------'||chr(10)    
order by    
  (  case mode    
    when 'INVALID' then 0   
    when 'AccessShareLock' then 1   
    when 'RowShareLock' then 2   
    when 'RowExclusiveLock' then 3   
    when 'ShareUpdateExclusiveLock' then 4   
    when 'ShareLock' then 5   
    when 'ShareRowExclusiveLock' then 6   
    when 'ExclusiveLock' then 7   
    when 'AccessExclusiveLock' then 8   
    else 0   
  end  ) desc,   
  (case when granted then 0 else 1 end)  
) as lock_conflict  
from t_unionall   
group by   
locktype,datname,relation,page,tuple,virtualxid,transactionid::text,classid,objid,objsubid ;  

到了这里,关于PG 锁冲突案例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PostgreSQL实战-pg13主从复制切换测试

    修改/etc/profile文件, 添加如下内容: 清空数据表数据 主库清空数据表数据 从库对应的数据表也会被清空 新增数据表数据 主库数据表插入数据一行 从库数据表也会插入一行 删除数据表数据

    2024年02月15日
    浏览(45)
  • POSTGRESQL PG15关于归档的新模式

    开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到3群(共810人左右 1 + 2 + 3),这里需要注意,如果想和 瑞典马工进行面对面的交

    2024年02月06日
    浏览(48)
  • 【PostgreSQL】连接pg数据库Schema切换

    由于PostgreSQL数据库模式(schema)存在多个,原先的表单是默认采用public但是查询表和字段时候有查询所有未进行过滤,导致数据库连接失败、查表字段也为空(空即查询服务端异常错误) 数据库连接配置 添加参数补充 ?currentSchema=dwd 譬如: username=root;password=XXXX;url=jdbc:postg

    2024年02月11日
    浏览(50)
  • 【PG】PostgreSQL高可用方案repmgr部署(非常详细)

    目录 简介 1 概述 1.1 术语 1.2 组件 1.2.1 repmgr 1.2.2 repmgrd 1.3 Repmgr用户与元数据 2 安装部署 2.0 部署环境  2.1 安装要求 2.1.1 操作系统 2.1.2 PostgreSQL 版本 2.1.3 操作系统用户 2.1.4 安装位置 2.1.5 版本要求 2.2 安装 2.2.1 软件包安装 2.2.2 源码编译安装 3 快速开始 3.2 PostgreSQL部署主库

    2024年02月02日
    浏览(43)
  • PG DBA培训23:PostgreSQL执行计划与统计信息

    本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQL Execution plan and statistical,学完本课程可以掌握PostgreSQL性能优化之查询处理,PostgreSQL处理SQL的整个逻辑顺序,PostgreSQL查询处理的流程讲解,PostgreSQL性能优化之执行计划,执行计划的介绍,执行计划查看语法,执行

    2024年01月22日
    浏览(50)
  • POSTGRESQL(PG) 性能优化之like全文检索优化

    使用like操作可以进行字符串比较,全文检索等,性能相对比较差,有些情况下可以通过建立索引来提升性能。下面我们通过使用TPCH orders表作为例子,来进行说明。但是请注意, not like是不能用任何索引的,BTREE不支持!=操作,只能进行=和范围查找。 TPCH orders表的定义如下,

    2024年02月05日
    浏览(52)
  • Postgresql 模块插件之pg_stat_statements

    相关链接: pgsql编译安装 pgBouncer连接池 pg_stat_statements 提供了跟踪服务器执行的所有 SQL 语句的规划和执行统计信息的方法。当 pg_stat_statements 处于活动状态时,它会跟踪服务器上所有数据库的统计信息。该模块收集到的统计数据可以通过一个名为 pg_stat_statements 的视图进行访

    2024年02月07日
    浏览(50)
  • PG DBA培训21:PostgreSQL性能优化之基准测试

    本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQL Performance Benchmarking,学完本课程可以掌握PostgreSQL性能基准测试基础知识,基准测试介绍,基准测试相关指标,TPCC基准测试基础,PostgreSQL测试工具介绍,PostgreSQL性能基准测试案例1之BenchmarkSQL,BenchmarkSQL测试介绍

    2024年01月25日
    浏览(56)
  • PostgreSQL PG16 逻辑复制在STANDBY 上工作 (译)

    开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共1100人左右 1 + 2 + 3)新人会进入3群 Postgres 16刚刚发布了测试版,我对其中

    2024年02月15日
    浏览(44)
  • 使用pg_prewarm缓存PostgreSQL数据库表

    pg_prewarm 直接利用系统缓存的代码,对操作系统发出异步prefetch请求,在应用中,尤其在OLAP的情况下,对于大表的分析等等是非常耗费查询的时间的,而即使我们使用select table的方式,这张表也并不可能将所有的数据都装载到内存中,而pg_prewarm的功能就是完成一个张表全部进入

    2024年02月14日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包