首页 > 数据库 >数据库——锁

数据库——锁

时间:2024-07-06 13:57:25浏览次数:23  
标签:事务 加锁 数据库 死锁 进程 资源


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. 其他具体方法

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

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

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

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

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

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

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

标签:事务,加锁,数据库,死锁,进程,资源
From: https://blog.csdn.net/longer_net/article/details/140228459

相关文章

  • 用友财务软件数据库恢复步骤
    一、准备工作确认问题:首先,确认是否真的需要数据库恢复。有时候,问题可能只是软件界面上的显示问题或配置错误,而非真正的数据丢失。备份当前状态(如果可能):在进行任何恢复操作之前,如果系统仍然可以访问,建议备份当前的数据库状态,以防恢复操作失败导致数据进一步丢失。二、查找备份......
  • 数据库原理之并发控制的基本概念
    我们今天继续来看数据库原理,我们简单讲讲数据库的并发控制。并发控制的定义并发控制是为了保证事务的隔离性和一致性,数据库管理系统需要对并发操作进行正确调度。并发控制的主要技术有:、时间戳、乐观控制法、多版本并发控制等。并发操作带来的数据不一致性主要有以下三点:......
  • 用友财务软件数据库恢复
    是一个关键的操作,旨在解决数据库文件损坏或数据丢失的问题。一、恢复方法使用软件内置的数据恢复工具步骤:打开用友财务软件,进入“工具”或“数据管理”等相关菜单。找到“数据库恢复”或“数据恢复”选项,点击进入。选择需要恢复的数据库文件和备份文件。这里需要确保备份文......
  • 管家婆数据库数据恢复
    一、确认数据丢失情况首先,需要确认数据是否真的丢失,以及丢失的数据范围。有时候,数据可能只是暂时无法访问,或者由于软件故障导致的数据显示问题。二、检查备份定期备份的重要性管家婆软件通常会具备自动备份功能,用户应该确保该功能已经开启,并定期检查备份文件的完整性和可用......
  • 数据库迁移工具
    对于国产数据库数据往Oracle数据库上迁移的需求,推荐使用以下几种迁移软件: 1.达梦数据迁移工具简介:达梦数据库自带的数据迁移工具,特别适用于达梦数据库(DM)到Oracle数据库的迁移。特点:专门为达梦数据库设计,对达梦数据库的特性有深入的支持。图形化界面,操作简便,用户可以通过简......
  • Linux关于数据库,群集,缓存加速等精捡面试题
    目录第一部分:企业网站架构部署与优化..................................................61.列举几种常见的HTTP状态码?及各种代表的含义?................................62.HTTP请求方法有哪些?请至少列举三种,并简述它们的用途。........................63.HTTP协......
  • sqlserver数据库MDF文件修复
    针对SQLServer数据库的MDF文件修复,这是一个相对复杂的过程,具体方法取决于文件的损坏程度、是否有备份以及数据库的状态。以下是一些常见的修复方法:使用备份恢复这是最直接且最可靠的方法。如果你有数据库的备份,并且备份是在MDF文件损坏之前创建的,那么你可以通过还原备份来恢......
  • Java项目:基于SSM框架实现的中小企业人力资源管理系统【ssm+B/S架构+源码+数据库+开题
    一、项目简介本项目是一套基于SSM框架实现的中小企业人力资源管理系统包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。项目都经过严格调试,eclipse或者idea确保可以运行!该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值......
  • 数据库raidZ数据恢复
    一、RAIDZ概述RAIDZ(有时也写作RAID-Z或ZFSRAID)是一种基于ZFS(ZFileSystem)文件系统的RAID技术,它特别为存储系统提供了高级别的数据冗余和恢复能力。RAIDZ将数据分散存储到多个磁盘上,并通过特定的校验和机制来确保数据的完整性和可恢复性。与传统的RAID级别(如RAID0、RAID1、RAI......
  • 数据库经验之谈-数据库join时必须使用索引
    数据库join时必须使用索引,否则效率急剧下降。当执行数据库JOIN操作时,如果没有使用索引,则数据库需要执行全表扫描(FullTableScan)来查找匹配的行。这意味着数据库将检查表中的每一行来确定是否有匹配的行。对于小型数据集,这可能不是问题,但随着数据集的增长,全表扫描的成本急剧......