数据库——锁


title: 数据库——锁
date: 2024-07-06 12:25:15
tags: 数据库
categories: 数据库
cover: /image/T2.jpg
description: 数据库里对锁的应用,锁的一些相关知识

在数据库管理和并发编程中,锁(Locks)是一种重要的同步机制,用于控制多个用户对共享资源的访问,以避免数据的不一致性和冲突。锁的主要目的是确保在给定时间内,只有一个事务(或进程、线程)可以访问特定的数据或资源。

锁的类型
  1. 共享锁(Shared Locks, S锁)

    • 允许多个事务同时读取同一资源,但禁止任何事务写入该资源。也称为读锁。
    • 当事务对数据加上S锁后,其他事务可以继续加S锁,但如果其他事务想加排他锁(X锁)则必须等待该事务释放S锁。
  2. 排他锁(Exclusive Locks, X锁)

    • 允许事务独占访问特定资源,即加锁期间既不允许其他事务读取,也不允许写入。也称为写锁。
    • 当事务对数据加上X锁后,其他事务不能对其加任何类型的锁,直到该锁被释放。
  3. 意向锁(Intention Locks)

    • 是一种特殊的表级锁,表示事务将来可能对表中的行加锁。意向锁分为意向共享锁(IS锁)和意向排他锁(IX锁)。
    • 意向锁的主要目的是表明事务的锁定意向,以提高锁定的效率。例如,在添加行级X锁之前,需要先在表上加IX锁,这样其他事务在尝试对表加S锁或X锁时就可以快速判断是否有冲突。
  4. 记录锁(Record Locks)

    • 锁定数据库表中的一条记录。
  5. 间隙锁(Gap Locks)

    • 锁定一个范围,但不包括记录本身。主要用于防止幻读。
  6. 临键锁(Next-Key Locks)

    • 是记录锁和间隙锁的组合,锁定一个范围并包括记录本身。MySQL的InnoDB存储引擎默认使用临键锁来防止幻读。
锁的特性
  • 互斥性:任何时刻,只有一个事务可以持有锁。
  • 可见性:锁定的资源对其他事务是不可见的,直到锁被释放。
  • 死锁:两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象。数据库管理系统需要检测和解决死锁问题。

锁的管理

  • 锁的粒度:决定了锁定资源的大小,可以是数据库、表、页或行。锁的粒度越小,系统的并发性越高,但管理锁的开销也越大。
  • 锁的策略:包括悲观锁(Pessimistic Locking)和乐观锁(Optimistic Locking)两种。悲观锁假定最坏的情况,在数据处理前就加锁;乐观锁则假设不会发生并发冲突,只在更新数据时检查是否有冲突。

在数据库设计中,合理地使用锁机制是保证数据一致性和完整性的关键。然而,过度的锁定会导致性能下降,因此需要根据具体的应用场景和需求来选择合适的锁策略和粒度。

事务隔离级别与锁
  • 在 读取未提交 隔离级别下,读取数据不需要加 共享锁,这样就不会跟被修改的数据上的 排他锁 冲突;

  • 在 读取已提交 隔离级别下,读操作需要加 共享锁,但是在语句执行完以后释放共享锁;

  • 在 可重复读 隔离级别下,读操作需要加 共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁;

  • 可串行化 是限制性最强的隔离级别,因为该级别 锁定整个范围的键,并一直持有锁,直到事务完成

死锁与解决
死锁简述

死锁是指两个或多个进程在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力作用,这些进程都将无法向前推进。具体来说,当一组进程中的每个进程都在等待另一个进程所占有的资源时,这组进程就发生了死锁。

死锁的产生通常源于多个进程对资源的争夺,主要包括以下几点:

  1. 系统资源不足:系统分配给进程的资源不足以满足所有进程的需求。
  2. 进程运行推进的顺序不当:进程推进顺序不当也可能导致死锁。
  3. 资源分配不当:资源分配策略不合理,如资源分配不均匀或过于集中。
死锁产生的必要条件
  1. 互斥条件:进程在运行中对资源进行排他性使用,即一个资源仅能被一个进程使用,此时其他进程请求资源时,只能等待其释放。
  2. 请求与保持条件:某进程已经保持了一个资源,但又请求另一个资源,若该资源被其他进程占有,此时请求阻塞,且对已经占有的资源不释放。
  3. 不可抢占条件:进程获得的资源在未使用完时不可被抢占,只能在进程使用完时自己释放。
  4. 循环等待条件:发生死锁时,必然存在这样一个循环,一个进程p1等待p2占有的资源,进程p2等待p3占有的资源……进程pn等待p1占有的资源。
死锁的解决办法
  1. 死锁预防

    • 这是一种较简单和直观的事先预防的方法。通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。但这种方法可能会导致系统资源利用率和系统吞吐量降低。
  2. 死锁避免

    • 系统对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源。如果分配后系统可能发生死锁,则不予分配,否则予以分配。这是一种保证系统不进入死锁状态的动态策略。
  3. 死锁检测和解除

    • 先检测:不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区。允许系统在运行过程中发生死锁,但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源。检测方法包括定时检测、效率低时检测、进程等待时检测等。
    • 然后解除死锁:采取适当措施,从系统中将已发生的死锁清除掉。常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。
  4. 其他具体方法

    • 按序加锁:确保所有的线程都是按照相同的顺序获得锁,这样可以有效防止循环等待条件的出现。
    • 尝试加锁超时:线程在尝试获取锁时设置一个超时时间,如果超时则放弃对该锁的请求,并释放已经占有的锁,然后等待一段时间后重试。
    • 锁排序和分组:将锁按照一定的规则进行排序或分组,并规定严格的加锁顺序,以减少死锁的发生。
    • 使用无锁数据结构:通过原子操作等无锁机制来实现并发控制,从而避免死锁的发生。
乐观锁和悲观锁
乐观锁
  • 核心思想:乐观锁认为数据在多个事务之间很少会发生冲突,因此在读取数据时不对其加锁。当更新数据时,会检查数据是否自上次读取后已被其他事务修改(通常通过版本号或时间戳)。

  • 优点:并发性能好,因为读取数据时不加锁。

  • 缺点:在高并发情况下,可能会出现较多的更新冲突,需要重试。

悲观锁
  • 核心思想:悲观锁认为数据在多个事务之间很容易发生冲突,因此在读取数据时立即加锁,以防止其他事务修改数据。

  • 优点:数据一致性好,能够防止数据在并发环境下被多个事务同时修改。

  • 缺点:并发性能较低,因为读取数据时就需要加锁,可能阻塞其他事务的访问。

简而言之,乐观锁适合读多写少的场景,而悲观锁适合写多读少的场景。

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

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

相关文章

Vue 3 中集成 ECharts(附一些案例)

Vue 3 中集成 ECharts 的完全指南 引言 在现代Web开发中,Vue 3以其卓越的性能和灵活的Composition API赢得了广泛的关注。而ECharts,作为开源的一个使用JavaScript实现的强大可视化库,以其丰富的图表类型和高度可定制性成为了数据可视化的首…

计算机的错误计算(二十二)

摘要 计算机的错误计算(十九)展示了计算机的一个错误计算:本应该为 0的算式的结果不为0. 那么,增加计算精度,能确定是0吗?不一定。 计算机的错误计算(十九)展示了计算机对 的错误计…

适用于 Windows的 5 个最佳 PDF 转 Word 转换器

PDF 文件是共享文档的首选格式,但是,此类文件存在限制,使其难以修改或编辑。因此,您可能会发现自己正在寻找一种将 PDF 文件转换为 Word 或其他可编辑格式的方法。 有许多不同的 PDF 转换器,每个转换器的功能略有不同…

vue require引入静态文件报错

如果是通过向后端发送请求,动态的获取对应的文件数据流很容易做到文件的显示和加载。现在研究,一些不存放在后端而直接存放在vue前端项目中的静态媒体文件如何加载。 通常情况下,vue项目的图片jpg,png等都可以直接在/ass…

Perl 语言入门学习及实践

一、Perl 语言简介 Perl,全称为“Practical Extraction and Reporting Language”,是一种功能强大的脚本语言,广泛应用于文本处理、系统管理、网络编程和Web开发等领域。其丰富的库支持和正则表达式能力,使得Perl成为数据挖掘、日…

hmmer数据库合并

下载的数据库,解压之后是一个很多hmm文件的文件夹,不便于注释 https://fileshare.csb.univie.ac.at/vog/vog224/vfam.hmm.tar.gz cat *.hmm > vog224.hmm hmmpress vog224.hmm比对 hmmscan --tblout test_VOG.tbl --domtblout test_VOG.dom --noal…

招聘一个1-3年经验的Java工程师:企业视角的技能与素质要求

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

数据库——redis常见面试题

title: 数据库——redis常见面试题 date: 2024-07-06 12:26:01 tags: 数据库 categories: 数据库 cover: /image/T2.jpg description: Redis数据库常见面试题 redis Redis是一个高性能的、基于内存的Key-Value数据库,支持多种数据结构,如字符串、哈希、…

Git错误分析

错误案例1: 原因:TortoiseGit多次安装导致,会记录首次安装路径,若安装路径改变,需要配置最后安装的路径。

Windows搭建本地对象存储服务MinIO并且使用springboot整合

开发文档: MinIO Windows中文文档 MinIO Object Storage for Windows (英文文档) 1、准备工作 准备一个空的文件夹,用来存放minio相关的内容; 这里是在D盘创建一个minio的文件夹; 后续所有跟MinIO相关…

matlab 超越椭圆函数图像绘制

matlab 超越椭圆函数图像绘制 超越椭圆函数图像绘制xy交叉项引入斜线负向斜线成分正向斜线成分 x^2 y^2 xy 1 (负向)绘制结果 x^2 y^2 - xy 1 (正向)绘制结果 超越椭圆函数图像绘制 xy交叉项引入斜线 相对于标准圆&#xf…

ESP32-Wifi问题解答

目录 前言 环境:arduino 芯片:ESP32 一、先上例程 1.大家打开官方例程 点击:示例->Wifi->WifiClient 2:Wifi配置 打开例程如图: 在1处设置WiFi名称 在2处设置WiFi密码 注意:双引号要留着 3:编译,烧录->问题发生了! 二、问题解决方法 1.…

NSK发布新版在线计算工具

July 01, 2024 NSK Ltd. Corporate Communications Department NSK Ltd. announced today that it has improved the engineering tools available on its website. The new engineering tools — NSK Online Catalog, Technical Calculations, and 2D/3D CAD Data — which …

ctfshow-web入门-文件包含(web87)巧用 php://filter 流绕过死亡函数的三种方法

目录 方法1&#xff1a;php://filter 流的 base64-decode 方法 方法2&#xff1a;通过 rot13 编码实现绕过 方法3&#xff1a;通过 strip_tags 函数去除 XML 标签 除了替换&#xff0c;新增 file_put_contents 函数&#xff0c;将会往 $file 里写入 <?php die(大佬别秀了…

E4.【C语言】练习:while和getchar的理解

#include <stdio.h> int main() {int ch 0;while ((ch getchar()) ! EOF){if (ch < 0 || ch>9)continue;putchar(ch);}return 0; } 理解上述代码 0-->48 9-->57 if行判断是否为数字&#xff0c;打印数字&#xff0c;不打印非数字

机器学习——随机森林

随机森林 1、集成学习方法 通过构造多个模型组合来解决单一的问题。它的原理是生成多个分类器/模型&#xff0c;各自独立的学习和做出预测。这些预测最后会结合成组合预测&#xff0c;因此优于任何一个单分类得到的预测。 2、什么是随机森林&#xff1f; 随机森林是一个包含…

[数据结构] 排序#插入排序希尔排序

标题&#xff1a;[数据结构] 排序#插入排序&希尔排序 水墨不写bug 目录 &#xff08;一&#xff09;插入排序 实现思路&#xff1a; 插入排序实现&#xff1a; &#xff08;二&#xff09;希尔排序 希尔排序的基本思想&#xff1a; 希尔排序的实现&#xff1a; 正…

IT入门知识第八部分《人工智能》(9/10)

1.引言 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;已成为推动技术革新的关键力量。它们不仅改变了我们与机器的互动方式&#xff0c;还极大地拓展了解决问题的可能性。本文将深入探讨人工智能和机器学习的基础&…

React@16.x(50)路由v5.x(15)源码(7)- 实现 Link 和 NavLink

目录 1&#xff0c;Link1.1&#xff0c;注意点1.2&#xff0c;实现 2&#xff0c;NavLink2.1&#xff0c;注意点2.2&#xff0c;实现 1&#xff0c;Link 作用&#xff1a;最终渲染为 <a> 标签&#xff0c;点击跳转对应路由时不刷新页面。 1.1&#xff0c;注意点 1&#…

Laravel广播:实现实时Web应用的魔法

标题&#xff1a;Laravel广播&#xff1a;实现实时Web应用的魔法 Laravel广播是一种强大的功能&#xff0c;它允许你将信息实时推送到用户的Web浏览器。无论是实时通知、聊天应用还是实时数据更新&#xff0c;Laravel广播都能提供高效的解决方案。本文将详细介绍Laravel广播的…