数据库常见死锁原因及处理

news2024/11/25 4:28:27

目录

  • 前言
    • 什么是死锁
    • 死锁产生的四个必要条件
  • 1. 表锁死锁
    • 死锁场景
    • 解决方案
    • 建议
  • 2. 行锁死锁
    • 2.1 两个事务分别想拿到对方持有的锁,互相等待,于是产生死锁
      • 死锁场景
      • 解决方案
    • 2.2 共享锁转换为排他锁
      • 死锁场景
      • 解决方案
  • 3. INSERT ... ON DUPLICATE KEY UPDATE产生death lock死锁
    • 死锁场景
    • 解决方案

前言

数据库是一个多用户使用的共享资源,当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并发控制的一个非常重要的技术。在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严重影响应用的正常执行。
在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。

什么是死锁

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去,此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进程称为死锁进程。

死锁产生的四个必要条件

•互斥条件:某段时间内,一个资源一次只能被一个进程访问。

•请求和保持条件:进程A已经拥有至少一个资源,此时又去申请其他资源,而该资源又正在被进程使用,此时请求进程阻塞,但对自己已经获得的资源保持不放。

•不剥夺条件:进程已获得的资源在未使用完不能被抢占,只能在自己使用完时由自己释放。

•环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

1. 表锁死锁

死锁场景

一个用户A 访问表A(锁住了表A),然后又访问表B;另一个用户B 访问表B(锁住了表B),然后企图访问表A;这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B才能继续,同样用户B要等用户A释放表A才能继续,这就死锁就产生了。

解决方案

这种死锁比较常见,是由于程序的BUG产生的,除了调整的程序的逻辑没有其它的办法。

建议

仔细分析程序的逻辑,对于数据库的多表操作时,尽量避免同时锁定两个资源,如必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源。(如操作A和B两张表时,总是按先A后B的顺序处理。)

2. 行锁死锁

2.1 两个事务分别想拿到对方持有的锁,互相等待,于是产生死锁

死锁场景

解决方案

  1. 在同一个事务中,尽可能做到一次锁定所需要的所有资源;
  2. 按照 id 对资源排序,然后按顺序进行处理。

2.2 共享锁转换为排他锁

死锁场景

事务A 查询一条纪录,然后更新该条纪录;此时事务B 也更新该条纪录,这时事务B 的排他锁由于事务A 有共享锁,必须等A 释放共享锁后才可以获取,只能排队等待。事务A 再执行更新操作时,此处发生死锁,因为事务A 需要排他锁来做更新操作。但是,无法授予该锁请求,因为事务B 已经有一个排他锁请求,并且正在等待事务A 释放其共享锁。

事务A

-- 共享锁,1
select * from dept where deptno=1 lock in share mode;
-- 排他锁,3
update dept set dname='java' where deptno=1;

事务B

-- 由于1有共享锁,没法获取排他锁,需等待,2
update dept set dname='Java' where deptno=1;

解决方案

使用乐观锁进行控制。乐观锁机制避免了长事务中的数据库加锁开销,大大提升了大并发量下的系统性能。需要注意的是,由于乐观锁机制是在我们的系统中实现,来自外部系统的用户更新操作不受我们系统的控制,因此可能会造成脏数据被更新到数据库中。

3. INSERT … ON DUPLICATE KEY UPDATE产生death lock死锁

死锁场景

insert … on duplicate key 在执行时,innodb引擎会先判断插入的行是否产生重复key错误,如果存在,在对该现有的行加上S(共享锁)锁,如果返回该行数据给mysql,然后mysql执行完duplicate后的update操作,然后对该记录加上X(排他锁),最后进行update写入。
在这里插入图片描述

解决方案

尽量不对存在多个唯一键的table使用该语句

https://blog.csdn.net/qq_16681169/article/details/74784193
https://blog.csdn.net/weixin_42201180/article/details/126447408
概述:https://blog.csdn.net/qq_34107571/article/details/78001309 INSERT
… ON DUPLICATE KEY UPDATE产生死锁原理:https://blog.csdn.net/pml18710973036/article/details/78452688

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/68756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]Python计算机毕业设计Django疫情防控平台

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

Watch事件介绍_java培训

Watch事件 Java培训课程 Watch事件 一次触发 当数据有了变化时zkserver向客户端发送一个watch,它是一次性的动作,即触发一次就不再有效,类似一次性纸杯。 只监控一次。如果想继续Watch的话,需要客户端重新设置Watcher。因此如果你得到一个w…

【Android Studio程序开发】按钮触控---按钮控件Button

除了文本视图之外,按钮Button也是一种基础控件。因为Button是由TextView派生而来,所以文本视图 拥有的属性和方法,包括文本内容、文本大小、文本颜色等,按钮控件均能使用。不同的是,Button拥有默认的按钮背景&#xff…

采购管理系统有什么用,哪个好?

如今随着各行各业的采购组织管理理念的不断变换,利用信息化手段来管理企业采购行为已然成为一种趋势。 现代采购管理系统可以使采购组织规范采购工作的组织实施,建立有责任感的管理体系,从而提高企业经济效益和采购质量,增强企业…

Linux搭建 FTP服务器

Linux搭建 FTP服务器 vsftpd 是 very secure ftp daemon 的缩写,它是 Linux 上使用最受欢迎、使用最广泛的 FTP 服务器之一,它具有安全,速度快,稳定的特点,很多重要的 FTP 站点比如 ftp.gnu.org、ftp.freebsd.org 都是…

【JavaWeb开发-Servlet】day03-URL参数传递与MySQL数据库连接

目录 1、登录示例,谁用url传递参数 (1)创建一个Servlet类,名字叫做loginServlet (2)保留需要的部分 (3)删除多余代码 (4)编写loginServlet.class &#xff08…

ICV:2022年中国车载摄像头市场规模有望突破50亿美元大关

全球前沿科技咨询机构ICV近期发布了全球车载摄像头的市场分析报告。ICV在报告中指出,车载摄像头市场随着乘用车自动驾驶的发展呈现出快速增长的趋势,2022年中国市场在全球范围内仍保持“市场领跑者”的地位,并有望突破50亿美元市场规模的大关…

Win10如何安装JDK1.8,最快最详细教程

JDK全称为Java Development Kit,顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包。 JRE全称为Java Runtime Environment,顾名思义是java运行时的环境,包含了java虚拟机,java基础类库&…

ABAP-SAP-整合事务码,整合平台,运维工具箱

PROCESS BEFORE OUTPUT. MODULE status_0100. * PROCESS AFTER INPUT. MODULE user_command_0100. MODULE exit_command_0100 AT EXIT-COMMAND. 源码: **Project Name : SAP Implementation Project **Program Name : ZTOOL **Description : 运维工具箱 **Date/Aut…

比羊了个羊还火的ChatGPT,玩法全攻略讲解

大家好,我是洋子,昨天听闻了ChatGPT,真的非常强大,赶紧给大家安利一波 ChatGPT是一种由OpenAI开发的通用聊天机器人模型 该模型是基于GPT-3(一种大型语言模型)构建的,旨在提供与人类更加自然的…

Pig4Cloud之登陆验证(二)发放token

上一篇介绍了客户端认证处理,那是令牌颁发的前提。这篇开始,我们就来研究下令牌颁发。 令牌颁发 授权服务器提供令牌颁发接口(/oauth2/token),由客户端发起请求,授权服务器生成访问令牌(acces…

常见的并发线程面试题

常见的并发面试题 一.进程与线程的区别? 进程是操作系统进行资源分配的最小单元,线程是操作系统进行运算调度的最小单元。进程中包含了线程,线程属于进程。进程的内存和资源是该进程下的线程所共享的。 二.创建线程的方式以及区别? 继承Thread类&am…

vue源码中的nextTick是怎样实现的

一、Vue.nextTick 内部逻辑 在执行 initGlobalAPI(Vue) 初始化 Vue 全局 API 中,这么定义 Vue.nextTick。 function initGlobalAPI(Vue) {//...Vue.nextTick nextTick; }可以看出是直接把 nextTick 函数赋值给 Vue.nextTick,就可以了,非常…

leetcode-每日一题-二进制表示中质数个计算置位(简单,popcount算法)

从这道题了解到了一个时间复杂度为o(1)的一个计算一个数转换为二进制时1存在的个数问题,很巧妙运用了二分来求解,代码如下 unsigned popcount (unsigned u) {u (u & 0x55555555) ((u >> 1) & 0x55555555);u (u & 0x33333333) ((u…

API接口使用方法(封装好的电商平台)

为了进行此平台API的调用,首先我们需要做下面几件事情。 1、 获取一个KEY。 点击获取 2、 参考API文档里的接入方式和示例。 3、查看测试工具是否有需要的接口,响应实例的返回字段是否符合参数要求。 4、利用平台的文档中心和API测试工具&#xff0c…

自定义网页中被选中文本的样式 CSS selection

文章目录两张图自定义被选中文本的样式::selection 选择器的可填属性::selection 选择器支持的CSS属性 完整版 demo浏览器兼容官网文档两张图 对于选中的文本(准确地说应该是被选中的DOM元素),浏览器的默认样式:淡青色的背景色。 2. 自定义样式&#xf…

[说明] Doris使用培训

参考文献 apache doris在蜀海供应链数仓建设中的实践 应用实践 | 数仓体系效率全面提升!同程数科基于 Apache Doris 的数据仓库建设 一、doris的背景介绍 doris的使用场景 实时/离线一体的数仓 借用一句话: Uniq 模型拳打KUDU、HUDI,Agg…

[LeetCode 1775]通过最少操作数使数组的和相等

题目描述 题目链接:[LeetCode 1775]通过最少操作数使数组的和相等 给你两个长度可能不等的整数数组 nums1 和 nums2 。两个数组中的所有值都在 1 到 6 之间(包含 1 和 6)。 每次操作中,你可以选择 任意 数组中的任意一个整数&a…

openEuler kubesphere kubekey 安装 ceph csi 及使用实例

按照官方文档,很轻松就可以进行安装, 安装过程中遇到一些疑问, 在安装后也得到清晰的理解 1. /root/ceph-csi-rbd.yaml 这里面的clusterId 按理说应该是ceph的clusterId, 不过官方文档并没有首重强调修改,暂时保持默认 下面6789端口就是我们在物理机上安装的ceph mon的主机i…

PCB设计指南:安规、布局布线、EMC、热设计、工艺

文章目录Part 1 安规距离要求部分一、爬电距离和电气间隙距离要求:Part 2 抗干扰、EMC部分一、长线路抗干扰二、小信号走线尽量远离大电流走线,忌平行,D>2.0mm。三、小信号线处理:电路板布线尽量集中,减少布板面积提…