iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >PostgreSQL死锁了怎么办及处理方法
  • 365
分享到

PostgreSQL死锁了怎么办及处理方法

PostgreSQL死锁PostgreSQL死锁处理 2023-01-13 12:01:13 365人浏览 八月长安
摘要

目录什么是数据库死锁如何确定死锁位置死锁的可能原因以及解决办法避免死锁的实战建议解决一:查询pg_stat_activity有没有记录解决二:查询pg_locks是否有这个对象的锁PS:postgresql表死锁问题的排

什么是数据库死锁

操作系统领域当中,死锁指的是两个或者两个以上的进程在运行的过程中,因为争夺共同的访问资源而相互等待阻塞,最终造成阻碍进程继续执行的一种阻塞现象。那么在数据库领域当中死锁又是怎样的表现形式呢?

如下图所示,假设事务A持有行1的共享锁,事务B持有行2的共享锁,那么此时事务A请求持有行2的排他锁,那么在事务B释放资源之前都处于阻塞等待的状态,同样的事务B请求持有行1的排他锁,在事务A 释放资源之前同样也是处于阻塞等待的状态。也就是说事务 B 完成之后事务 A 才能完成,而事务A的完成又依赖于事务B的完成,这就形成了循环依赖的问题,最终导致死锁情况的发生。

PostgreSQL死锁了怎么办及处理方法

如何确定死锁位置

//先确定数据库有没有死锁情况发生
select * from pg_stat_activity where datname = 'product_db';

//查询可能锁了的表的oid
select oid from pg_class where relname='product';

//查询对应的pid
select pid from pg_locks where relation='oid'  //上面查询出来的oid

//取消或者终止对应的进程
select pg_cancel_backend(pid);
select pg_terminate_backend(pid);

死锁的可能原因以及解决办法

以上分析了Postgresql出现死锁后如何定位分析,那么接下来就需要总结分析分析下数据库出现死锁情况的原因以及一般的应对解决办法。

1、索引使用问题导致的死锁问题

索引使用存在问题的话会导致死锁问题,假设在一个数据查询的事务当中,进行数据检索的时候没办法按照SQL中的where条件进行查询,因此导致了全表扫描,那么此时数据库表的行级锁会上升为表级锁。如果此时有多个未能按照where条件进行数据查询的事务存在,那么就容易导致数据库死锁问题。也就是说在数据库表数据量比较大的时候,对应进行数据查询的表没有建立索引或者说索引创建的不合理导致无法通过索引进行数据查询,只能通过全表索引,这样的场景下就容易产生死锁。

如何避免:
在进行数据查询的时候,对应的SQL语句不宜太过复杂,也就是说尽量避免多张表的关联查询。

2、不同事务之间的访问顺序问题

当用户A 访问数据库表A时,此时对表A加了共享锁,然后又访问数据库表B。而此时另一个用户B 访问表B,对表B加了共享锁,然后试图访问表A。但是用户A由于用户B已经锁住表B,它必须等待用户B释放表B才能继续,同样用户B要等用户A释放表A才能继续,也就是说互相等待对方释放资源,从而导致了死锁的发生。

如何避免:
这种情况在实际项目中遇到的可能比较多,主要还是需要通过控制代码的执行逻辑,避免多表操作时同时锁住多个资源。

避免死锁的实战建议

(1)如果平台中存在大事务,尽量将其拆分为小事务。因为大事务一般操作的数据库表或者数据都比较多,因此造成死锁或者阻塞的概率就会相对较大。

(2)为数据库表设计合理的索引,尽量避免数据查询时索引未覆盖或者索引失效的情况,因为全表扫描会会导致给表中的数据行上锁,大大增加了数据库产生死锁的概率。

(3)如果业务允许,我们可以尝试将隔离级别调低,比如将隔离级别从RR调整为RC,可以避免掉很多因为gap锁造成的死锁。

补充:下面在看下Postgresql死锁的处理

背景:

对表进行所有操作都卡住,原因可能是更新表时导致这个表死锁了,开始进行排查

解决一:查询pg_stat_activity有没有记录

pg版本10.2

select pid,query,* from pg_stat_activity where datname='死锁的数据库' and wait_event_type = 'Lock';
select pg_cancel_backend('死锁那条数据的pid值');##只能杀死select 语句, 对其他语句不生效
pg_terminate_backend('死锁那条数据的pid值');#select,drop等各种操作

执行后发现select和delete表时正常执行,但truncate和drop表时会一直运行,也不报错。

“drop table” 和 “truncate table” 需要申请排它锁"Access EXCLUSIVE", 执行这个命令卡住时,说明此时这张表上还有操作正在进行,比如查询等,

那么只有等待这个查询操作完成,“drop table” 或"truncate table"或者增加字段的SQL才能获取这张表上的 "ACCESS EXCLUSIVE"锁,操作才能进行下去。

解决二:查询pg_locks是否有这个对象的锁

select oid,relname from pg_class where relname='table name';
select locktype,pid,relation,mode,granted,* from pg_locks where relation= '上面查询出来的oid';
select pg_terminate_backend('进程ID');

问题解决!!!

坑:一开始不知道pg_cancel_backend(‘死锁那条数据的pid值');##只能杀死select 语句, 对其他语句不生效,杀了进程查询发现还存在,反复杀反复存在,换了pg_terminate_backend(‘进程ID')问题就解决了。

PS:postgresql表死锁问题的排查方式

1.查询激活的执行中的sql,查看有哪些更新update的sql。

select *
from pg_stat_activity
where state = 'active';

2. 查询表中存在的锁

select a.locktype, a.database, a.pid, a.mode, a.relation, b.relname
from pg_locks a
join pg_class b on a.relation = b.oid
where lower(b.relname) = 'h5_game';

3. 杀掉死锁进程

select pg_terminate_backend(pid)
from pg_stat_activity
where state = 'active'
and pid != pg_backend_pid()
--and pid = 14172
and pid in (select a.pid
from pg_locks a
join pg_class b on a.relation = b.oid
where lower(b.relname) = 'news_content')

锁模式


#define NoLock                 0
 
#define AccessshareLock         1        
#define RowShareLock          2        
#define RowExclusiveLock        3        
#define ShareUpdateExclusiveLock 4       
#define ShareLock                5        
#define ShareRowExclusiveLock  6        
#define ExclusiveLock          7        
#define AccessExclusiveLock       8        

到此这篇关于PostgreSQL死锁了怎么办?的文章就介绍到这了,更多相关PostgreSQL死锁内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: PostgreSQL死锁了怎么办及处理方法

本文链接: https://www.lsjlt.com/news/177609.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PostgreSQL死锁了怎么办及处理方法
    目录什么是数据库死锁如何确定死锁位置死锁的可能原因以及解决办法避免死锁的实战建议解决一:查询pg_stat_activity有没有记录解决二:查询pg_locks是否有这个对象的锁PS:PostgreSQL表死锁问题的排...
    99+
    2023-01-13
    PostgreSQL死锁 PostgreSQL死锁处理
  • MySQL的innoDB锁机制以及死锁的处理方法
    本篇内容主要讲解“MySQL的innoDB锁机制以及死锁的处理方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL的innoDB锁机制以及死锁的处理方法...
    99+
    2024-04-02
  • MySQL什么情况下会死锁,发生了死锁怎么处理呢?
    🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业...
    99+
    2023-09-22
    mysql 数据库 死锁 innodb 数据库事物 原力计划
  • MySQL是怎么处理死锁的
    小编给大家分享一下MySQL是怎么处理死锁的,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、什么是死锁官方定义如下:两个事务都持有对方需要的锁,并且在等待对方释放,并且双方都不会释放自己...
    99+
    2024-04-02
  • oracle死锁查询和处理的方法是什么
    Oracle数据库提供了多种方法来查询和处理死锁。以下是一些常用的方法: 查询死锁:可以使用以下SQL语句查询当前是否存在死锁: ...
    99+
    2024-04-09
    oracle
  • 数据库死锁处理的方法有哪些
    以下是一些处理数据库死锁的方法:1. 避免死锁:尽量设计良好的数据库结构,避免出现死锁的情况。可以使用合适的事务隔离级别,以及良好的...
    99+
    2023-09-20
    数据库
  • sql死锁的原因及解决方法是什么
    SQL死锁是指在多个并发事务中,每个事务都在等待其他事务所持有的资源,导致所有事务都无法继续执行的状态。死锁的原因主要有以下几种:1...
    99+
    2023-08-16
    sql
  • .NET监视程序中死锁怎么处理
    这篇文章将为大家详细讲解有关.NET监视程序中死锁怎么处理,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。监视程序主要是用来监控是否出现死锁等情况,但是这种.NET监视程序一般只能在测试中使用,如果大范围使...
    99+
    2023-06-17
  • mysql死锁排查及解决的方法是什么
    MySQL死锁是指两个或多个事务相互等待对方持有的资源,导致无法继续执行的情况。为了排查和解决MySQL死锁,可以采取以下方法:1....
    99+
    2023-08-16
    mysql
  • 多线程update导致的mysql死锁问题处理方法
    最近想起之前处理过的一个mysql 死锁问题,是在高并发下update批量更新导致的,这里探讨一下发生的原因,以及解决办法; 发生死锁的sql语句如下,其中where条件后的字段是有复合索引的。 update t_push_mes...
    99+
    2023-09-06
    数据库 java 开发语言 mysql死锁问题 mysql
  • redis锁超时了怎么处理
    redis 锁超时处理方法:1. 心跳续约;2. 自动重试;3. 主动释放;4. 定期检查;5. 使用 lua 脚本;6. 使用 watchdog。综合考虑应用程序要求和容错需求,选择最...
    99+
    2024-04-08
    redis
  • win7假死机怎么办 win7系统假死机的原因以及解决方法
      电脑安装Windows7系统使用过程中突然出现卡屏的情况,我们叫win7假死机状态。今天小编就为大家分享win7系统假死机解决方法,需要的朋友可以看看   win7假死机解决办法:   首先,最好不要安装各种所谓的...
    99+
    2023-06-13
    win7 假死机 死机 原因 系统
  • Oracle中表被锁的原因及处理方法
    Oracle中表被锁的原因及处理方法 在Oracle数据库中,表被锁是一种常见的现象,而造成表被锁的原因也有很多种。本文将探讨一些常见的表被锁的原因,并提供一些处理方法以及相关的代码示...
    99+
    2024-03-03
    处理方法 锁定原因 oracle表 sql语句
  • 公司仓库数据库服务器死锁过程及解决办法是什么
    这篇文章将为大家详细讲解有关公司仓库数据库服务器死锁过程及解决办法是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。死锁的四个必要条件:互斥条件(Mutu...
    99+
    2024-04-02
  • C++中怎么处理多进程环境下的死锁问题
    在C++中处理多进程环境下的死锁问题,可以使用以下几种方法: 避免死锁:在设计多进程程序时,尽量避免出现死锁的情况。可以通过规范...
    99+
    2024-04-02
  • 免费升级Win10系统后打不开怎么办 Win10锁屏睡眠睡死解决办法
    目前,已经进入win10系统免费升级的最后阶段了,相信不少网友都在加紧升级系统的步骤。不过,也有一些网友在使用win10系统的过程中遇到了难题。一位网友反映:他的电脑已经升级了win10系统的电脑,但是,使用过程中出了点...
    99+
    2023-05-21
    win10系统后打不开 win10锁屏睡眠睡死
  • Win11绿屏怎么办?Win11绿屏死机的解决方法
      Win11系统是目前非常火热的电脑操作系统,因为是最新的操作系统,很多用户都安装了,但是最近有安装Win11的用户都遇到了绿屏的问题,这导致了无法安装还会不断的无限重启,所以下面小编就为你们带来了Win11绿屏解决方...
    99+
    2023-05-23
    Win11绿屏
  • Win11死亡空间2闪退怎么办?Win11死亡空间2闪退解决方法
      Win11玩不了死亡空间2怎么办?使用电脑去玩死亡空间2这款游戏的   解决方法   1、首先按下键盘“win+r”打开运行,输入“gpedit.msc”回车确定打开组...
    99+
    2023-05-19
    Win11死亡空间 死亡空间2闪退
  • win7总是自动锁屏怎么办的解决方法
    win7系统电脑自动锁屏时间是可以自定义设置的,如果一段时间没有操作电脑,它会自动黑屏,再次启动只要移动鼠标即可启动。今天小编要与大家分享的是如何解决win7自动锁屏的问题,让我们一起来了解一下。1、电脑桌面的空白处单击鼠标右键,选择个性化...
    99+
    2023-07-16
  • 云服务器被攻击怎么办,快速处理方法
    云服务器是一种虚拟化资源,其中的服务器可以用于存储、处理和提供数据,因此它们在使用过程中容易受到攻击,下面是一些可以采取的措施以应对云服务器攻击: 定期检查云服务器和其支持的应用程序。定期检查是否存在漏洞或被攻破的迹象,及时修复,确保云...
    99+
    2023-10-27
    快速 服务器 方法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作