KADB锁冲突查看及解决

  • 构造锁冲突

分布开启两个终端,一个终端执行:

begin;

update data_table set addr='test' where id=89;

另外一个终端执行:

alter table data_table add test varchar(20);

  • 观察锁冲突情况

test=# select pid,waiting,waiting_reason,query from pg_stat_activity;

 pid  | waiting | waiting_reason | query                             

------+---------+----------------+----------------------------------------------------------------

 3059 | t       | lock           | alter table data_table add test varchar(20);

 3055 | f       |               | update data_table set addr='test' where id=89;

 4295 | f       |            | select pid,waiting,waiting_reason,query from pg_stat_activity;

(3 rows)

可以看到pid为3059的进程处于锁等待状态,此时还不能确定是哪个进程,执行的什么SQL导致进程3059的锁等待

  • 锁冲突解决

方法一、通过查询pg_locks表确定锁冲突关系

查询进程3059加锁的表

test=# select database,relation from pg_locks where pid=3059;

 database | relation

----------+----------

    18097 |    18334

(2 rows)

可以知道被加锁的对象的oid为18334

再次查询对象18334上加锁的进程

test=# select pid from pg_locks where relation=18334;

 pid 

------

 3059

 3055

 3055

 3222

 3222

 3223

 3223

查询这些进程执行的SQL,从而定位导致3059进程锁等待的SQL

test=# select query from pg_stat_activity where pid in (3222,3055,3223);

                     query                     

------------------------------------------------

 update data_table set addr='test' where id=89;

(1 row)

方法二、通过gp_toolkit.gp_locks_on_relations视图

test=# select * from gp_toolkit.gp_locks_on_relation where lorrelname like '%data_table%';

 lorlocktype | lordatabase | lorrelname | lorrelation | lortransaction | lorpid |       lormode       | lorgranted |                lorcurrentque

ry                

-------------+-------------+------------+-------------+----------------+--------+---------------------+------------+--------

 relation    |       18097 | data_table |       18334 |                |   3059 | AccessExclusiveLock | f          | alter table data_table add t

est varchar(20);

 relation    |       18097 | data_table |       18334 |                |   3055 | AccessShareLock     | t          | update data_table set addr='

test' where id=89;

 relation    |       18097 | data_table |       18334 |                |   3055 | ExclusiveLock       | t          | update data_table set addr='

test' where id=89;

(3 rows)

最后通过执行下面的语句,将造成锁等待的进程终止执行来解决锁等待问题(不要随便终止进程,需谨慎

test=# select pg_terminate_backend('3055');

 pg_terminate_backend

----------------------

 t

(1 row)

相关推荐

  1. KADB冲突查看解决

    2024-04-08 07:30:06       11 阅读
  2. Android事件冲突原理解决方法

    2024-04-08 07:30:06       35 阅读
  3. mockito-02-spring aop 与 mockito 冲突解决方案

    2024-04-08 07:30:06       21 阅读
  4. Postgresql 连接数查看,死问题解决

    2024-04-08 07:30:06       22 阅读
  5. git解决冲突问题

    2024-04-08 07:30:06       9 阅读
  6. 解决git合并冲突

    2024-04-08 07:30:06       10 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-08 07:30:06       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-08 07:30:06       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-08 07:30:06       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-08 07:30:06       20 阅读

热门阅读

  1. 金融数据_Scikit-Learn决策树(DecisionTreeClassifier)实例

    2024-04-08 07:30:06       14 阅读
  2. 【面经】软件开发工程师-后端方向1

    2024-04-08 07:30:06       12 阅读
  3. 2024-04-07(复盘前端)

    2024-04-08 07:30:06       12 阅读
  4. MCU电子方案开发

    2024-04-08 07:30:06       13 阅读
  5. Vue3 + TS 按需引入和全局引入 Echarts

    2024-04-08 07:30:06       12 阅读
  6. FPGA与数字图像处理专栏分类与索引

    2024-04-08 07:30:06       14 阅读
  7. 【rabbitmq】rabbitmq与erlang的版本对应关系

    2024-04-08 07:30:06       15 阅读
  8. c++ const关键词介绍

    2024-04-08 07:30:06       16 阅读
  9. logstash接收kafka日志

    2024-04-08 07:30:06       17 阅读
  10. Elasticsearch知识点

    2024-04-08 07:30:06       14 阅读
  11. mac在终端使用命令启动IDEA打开项目

    2024-04-08 07:30:06       20 阅读
  12. 【Linux】 Vim:掌握高效编辑的艺术

    2024-04-08 07:30:06       14 阅读