PostgreSQL-什么是死锁?如何解决?

news/2024/7/9 22:49:03 标签: postgresql

死锁是指两个或两个以上的事务在执行过程中互相持有对方期待的锁,若没有其他机制,它们都将无法进行下去

例如,事务1在表A上持有一个排它锁,同时试图请求一个在表B上的排它锁,而事务2已经持有表B的排它锁,同时却在请求A表上的一个排它锁,那么两个事务就都不能执行了。

PG能够自动侦测到死锁,然后退出其中一个事务,从而允许其他事务执行。不过,哪个事务会被退出是很难预测的

死锁发生条件

死锁发生必须具备以下4个必要条件:

  1. 互斥条件:指事务对所分配到的资源加了排它锁,即在一段时间内只能由一个事务加锁占用。如果此时还有其他进程请求排它锁,则请求者只能等待,直至持有排它锁的事务释放排它锁
  2. 请求和保持条件:指事务已经至少持有了一把排它锁,但又提出了新的排它锁请求,而该资源上的排它锁已被其他事务占有,此时请求被阻塞,但同时它对自己已获得的排它锁又持有不放
  3. 不剥夺条件:指事务已获得的锁在未使用完之前不能被其他进程剥夺,只能在使用完时由自己释放
  4. 环路等待条件:指发生死锁时,必然存在一个事务-资源的环形链,即事务集合{T0,T1,T2…Tn}中的T0正在等待T1持有的排它锁;P1正在等待P2持有的排它锁,…,Pn正在等待已被P0持有的排它锁

死锁解决方案

  1. 防止死锁最好的方法通常是保证使用一个数据库的所有应用都以相同的顺序在多个对象上请求排它锁。比如,在应用编程中,认为规定在一个事务中只能以一个固定顺序来更新表。假设在数据库中有ABCD4张表,现规定只能按如下顺序修改这几张表:B->C->A->D,若某个进程先更新了A表,如果想更新C表,则必须先回滚先前对A表的更新,然后再按规定的顺序,先更新C表,再更新A表。
  2. 数据库可以自动检测出死锁,所以应用也可以通过捕获死锁异常来处理死锁。但这个方法并不是很好,因为数据库检测死锁需要付出一定的代价,可能会导致应用程序过久地持有排它锁而使系统的并发处理能力下降。
  3. 排它锁持有的事件越长就越容易导致死锁,所以在进行程序设计时要尽量短时间地持有排它锁。

http://www.niftyadmin.cn/n/394524.html

相关文章

百度狂问3小时,大厂offer到手,小伙真狠!(百度面试真题)

前言: 在40岁老架构师尼恩的(50)读者社群中,经常有小伙伴,需要面试 百度、头条、美团、阿里、京东等大厂。 下面是一个小伙伴成功拿到通过了百度三次技术面试,小伙伴通过三个多小时技术拷问,最…

Python 线程优先级

文章目录 Python 中的线程控制Python线程的调度优先级导入有用的库在 Python 中使用多线程调度优先级创建 Worker 类 本文旨在解释我们如何在 Python 中使用调度线程使其成为优先级。 在这里,我们将讨论如何在 Python 中安排一个优先级线程,并将其与一个…

java并发编程:多线程基础知识介绍

文章目录 进程与线程上下文切换线程的创建1、实现Runnable接口2、继承Thread类3、实现Callable接口4、通过线程池创建线程 线程的生命周期线程的优先级线程的停止小结 进程与线程 最初的计算机只能接受一些特定的指令,用户每输入一个指令,计算机就做出一…

华为OD机试真题 Java 实现【猴子爬山】【2023 B卷 100分】,附详细解题思路

一、题目描述 一天一只顽猴想去从山脚爬到山顶,途中经过一个有个N个台阶的阶梯,但是这猴子有一个习惯: 每一次只能跳1步或跳3步,试问猴子通过这个阶梯有多少种不同的跳跃方式? 二、输入描述 输入只有一个整数N&…

达梦数据库运维常用归档、sql日志、dexp与dimp操作

目录 一、归档文件配置... 3 二、sql⽇志的开启和关闭以及基本的操作... 3 三、执行计划... 5 四、工具和命令行数据库物理、逻辑备份,还原... 6 1、工具物理备份... 6 2、命令行联机备份... 8 3、命令行脱机备份... 8 4、工具物理还原... 8 5、命令行DMRM…

自然语言处理从入门到应用——自然语言处理的基本问题:序列到序列(Sequence-to-Sequence,Seq2seq)问题

分类目录:《自然语言处理从入门到应用》总目录 除了文本分类和结构预测问题,还有很多自然语言处理问题可以归为序列到序列(Sequence-to-Sequence,Seq2seq)问题。机器翻译问题就是典型的代表,其中&#xff0…

MySQL脏读、不可重复读、幻读的区别与注意事项

目录 一、引入二、事务并发执行会遇到的问题1. 区别2. 注意 三、隔离级别四、参考资料 一、引入 MySQL的架构是 C/S 架构(即 客户端/服务器 架构),一个服务器可能有多个客户端与之相连接,每个连接称之为会话(Session&…

chatgpt赋能python:Python反转数字的方法

Python反转数字的方法 Python作为一种高级编程语言,拥有着丰富的数学计算、数组处理及字符串操作等功能。在实际开发中,需要进行反转数字的操作时,Python提供了多种方法来完成此项任务。 用Python反转数字 反转数字是指将一个数字从后往前…