首页 > 其他分享 >排它锁、共享锁与死锁的全面解析

排它锁、共享锁与死锁的全面解析

时间:2024-09-16 14:53:56浏览次数:10  
标签:封锁 事务 加锁 T1 死锁 排它 解析 数据

前言

在数据库技术中,封锁 是实现并发控制的核心手段。它保证了多个事务同时进行时的数据一致性,避免了数据冲突和错误。对于初学者来说,理解封锁技术是迈向数据库高手的第一步。这篇文章将通过简洁明了的方式,帮助你轻松掌握封锁的相关知识。


什么是封锁?为什么重要?

封锁,顾名思义,就是在对数据进行操作前,先“锁定”它,确保在操作完成之前,其他事务不能对该数据进行修改。封锁的本质是对数据库资源的一种保护机制,防止多个事务同时修改数据导致的不一致。


基本封锁:排它锁与共享锁

封锁有多种类型,但是排它锁(X锁)共享锁(S锁) 是最基本的两种。

  • 排它锁(X锁) :又称为写锁。当事务T对一个数据对象加上X锁后,其他事务不能对该数据对象进行任何操作,直到T释放X锁。简单来说,X锁让事务独占该数据对象。

    举例:如果事务T1对“订单”表中的一条记录加上了X锁,那么其他事务(如T2)不能对该记录进行读或写操作,直到T1释放该锁。

  • 共享锁(S锁) :又称为读锁。当事务T对一个数据对象加上S锁后,其他事务可以继续对该数据对象加S锁,但不能加X锁。也就是说,多个事务可以同时读取数据,但不能修改数据。

    举例:事务T1对“用户信息”表中的一条记录加上S锁后,事务T2也可以对该记录进行读取操作,但不能修改。


锁的相容性

锁的相容性 决定了某个事务能否对已经被其他事务加锁的数据再加锁。如下所示:

image

  • Y 表示锁兼容,T1可以成功加锁。
  • N 表示锁不兼容,T1的加锁请求会被拒绝。

举例:如果T2对某数据加了S锁,T1可以继续对该数据加S锁,但不能加X锁。


封锁粒度:如何选择封锁对象?

封锁粒度 指的是封锁对象的大小。从小到大,封锁粒度可以是属性值、元组、关系(表)、数据库等单位。

  • 粒度越小:并发度越高,但系统开销更大。
  • 粒度越大:并发度降低,但系统开销减少。

举例:如果一个事务只处理几条记录,那么以元组为封锁粒度较为合适;而如果处理大量记录,封锁整个可能更合适。


封锁协议:三级封锁协议详解

为了保证数据的一致性,数据库引入了封锁协议,规定了何时加锁、何时释放锁。常见的有三级封锁协议

一级封锁协议
  • 事务T在修改数据对象之前必须加X锁,直到事务结束才能释放X锁
  • 防止丢失修改,但不能防止读“脏”数据和不可重复读

举例:T1对数据A加X锁,T2必须等待T1释放锁后,才能对A进行操作。

二级封锁协议
  • 在一级封锁协议的基础上,事务T读取数据前必须加S锁,读完后立即释放
  • 防止丢失修改和读“脏”数据,但不能防止不可重复读

举例:T1加X锁并修改数据,T2在读取数据时加S锁,读完后释放S锁。

三级封锁协议
  • 在二级封锁协议的基础上,事务T读取数据后直到事务结束才释放S锁

  • 防止丢失修改、读“脏”数据和不可重复读

    image

举例:T1加S锁读取数据后,T2必须等待T1结束事务并释放锁,才能对数据进行修改。


活锁与死锁:并发控制的新挑战

尽管封锁技术能有效解决并发问题,但它也可能引发新的挑战,如活锁死锁

活锁

活锁 发生在某个事务一直处于等待状态,永远无法获得锁的情况。

死锁

死锁 是指多个事务互相等待对方释放锁,导致所有事务都无法继续执行。

举例:T1获得了数据A的锁,T2获得了数据B的锁。然后T1想要获取B的锁,T2想要获取A的锁,结果两者互相等待,形成死锁。

image


解决死锁的策略

为了避免死锁,通常有两类方法:

  1. 死锁预防

    • 一次封锁法:事务必须一次性加锁所有需要的数据,但这可能降低并发度。
    • 顺序封锁法:所有事务按照一个固定的顺序加锁,避免互相等待。
  2. 死锁检测与解除

    • 超时法:如果一个事务等待的时间超过了某个时间限制,系统会认为发生了死锁,强制中止事务。

    • 事务等待图法:系统定期监控等待情况,如果发现事务之间存在循环等待,说明发生了死锁,系统将中止某个事务以解除死锁。

      • image

总结

封锁技术是数据库并发控制的核心手段。通过排它锁共享锁的使用,数据库可以有效地保证事务之间的隔离性,防止数据不一致问题的发生。而封锁协议则为封锁的使用提供了明确的规则,帮助我们解决丢失修改、读“脏”数据和不可重复读等问题。虽然封锁机制可能带来活锁死锁等挑战,但通过合理的预防和检测手段,我们可以有效应对这些问题。

标签:封锁,事务,加锁,T1,死锁,排它,解析,数据
From: https://blog.csdn.net/2301_80064376/article/details/142179688

相关文章

  • ArrayList 源码解析
    ArrayList是Java集合框架中的一个动态数组实现,提供了可变大小的数组功能。它继承自AbstractList并实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同。每个ArrayList都有一个容量capac......
  • 1----安卓机型修复串码 开启端口 檫除基带 支持高通与MTK机型工具预览与操作解析
              在玩机过程中。很多玩家会碰到各种各样的故障。其中最多的就在于基带串码类。由于目前的安卓机型必须修改或者写入串码等参数必须开启端口。而一些初级玩友不太了解开启参数端口的步骤。这个工具很简单的为安卓机型开启端口。并且操作相对简单......
  • Javaweb之SpringBootWeb案例之阿里云OSS服务入门的详细解析
     2.3.2入门阿里云oss对象存储服务的准备工作我们已经完成了,接下来我们就来完成第二步操作:参照官方所提供的sdk示例来编写入门程序。首先我们需要来打开阿里云OSS的官方文档,在官方文档中找到SDK的示例代码:编辑编辑编辑编辑参照官方提供的SDK,改造一下,即可实现文件上传功能:import......
  • Vite 打包之“坑”全解析(问题+解决方案)
    ......
  • 深入解析C++函数指针:掌握游戏开发中的关键技术
    深入解析C++函数指针:掌握游戏开发中的关键技术C++作为一门经典的编程语言,因其强大的性能和灵活性,被广泛应用于游戏开发。而函数指针作为C++中的一个重要概念,在游戏开发中更是扮演着不可或缺的角色。对于想要深入掌握C++并在游戏开发领域站稳脚跟的开发者来说,理解并灵活运用函数指......
  • GESP5级 2024 9 7 T2 解析 <全网首发>
    题目3.2编程题2试题名称:挑战怪物时间限制:1.0s内存限制:512.0MB3.2.1题面描述小杨正在和一个怪物战斗,怪物的血量为,只有当怪物的血量恰好为时小杨才能够成功击败怪物。小杨有两种攻击怪物的方式:    1.物理攻击。假设当前为小杨第次使用物理攻击,则会对......
  • Nacos与Eureka的区别:深入解析微服务中的服务注册与发现
    在微服务架构中,服务注册与发现是确保各个服务之间高效通信与协调的重要机制。随着云原生应用的快速发展,服务治理的需求也在不断增长。在这一背景下,Nacos和Eureka作为两种主流的服务注册与发现工具,各具特色和优势。本文将深入分析Nacos与Eureka之间的区别,帮助开发者选择最适合自......
  • 安卓系统启动流程解析
    安卓系统启动流程目录1init阶段1.1FirstStage1.2SELinuxSetup1.3SecondStage2init.rc的配置3Zygote的启动3.1app_process3.2Zygoteinit.java4SystemServer5总结6引用光看分析文章还是不够的,还是要和实践结合。1init阶段init命令的入口是init......
  • SQL查询技巧:深入解析学生选课系统数据库
            在大学的学生选课系统中,数据库的管理和查询是日常操作中的重要部分。本文通过一系列具体的SQL查询示例,深入解析如何高效地从数据库中获取所需信息,包括学生选课情况、成绩分析、教师课程管理等。系统数据库结构首先,我们有一个包含以下表的数据库:course -存......
  • FastAPI 应用安全加固:HTTPSRedirectMiddleware 中间件全解析
    在当今的网络环境中,数据安全变得越来越重要。HTTPS作为一种安全协议,它通过加密传输数据来保护用户信息免受窃取和篡改。在FastAPI应用中,确保所有的HTTP请求都通过HTTPS进行是至关重要的。中间件在FastAPI中用于处理请求前后的通用任务,例如身份验证、日志记录、请......