首页 > 数据库 >数据库锁定机制

数据库锁定机制

时间:2024-10-07 16:44:16浏览次数:5  
标签:表锁 独占 行锁 队列 数据库 机制 锁定 共享

数据库锁定机制

话说如果你只是单纯的说 "锁表",总是让人感觉有点 Low ,而我们就直接换个比较高大上一点的名词,锁定机制!

为了保证数据的完整,也就是他的一致性和有效性,所以才会让数据库出现了锁定机制,相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。

  • MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking)
  • BDB存储引擎采用的是页面锁(page-level locking),也支持表级锁
  • InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁

我们先来瞅瞅看一下这些锁都是个什么鬼东西!

行级锁(row-level locking)

  • 锁的对象颗粒度很小
  • 各大数据库中锁粒度最小的
  • 锁定资源占用概率最小

虽然说行级锁的优点是很明显,但是相对的弊端也因为他的优点出现了,

  • 因为锁定的粒度比较小,所以每次获取锁和释放锁需要做更多的内容,带来的消耗必然也就更大了,
  • 行级锁也是最容易发生死锁的。
  • 并发度也最高

表级锁(table-level locking)

  • 和行锁相反,粒度是最大的
  • 逻辑简单,对系统的负面影响比较小
  • 获取锁和释放锁速度快
  • 并发度最低。

弊端也有,因为粒度比较大,锁定资源占用概率也会很大,

页级锁(page-level locking)

  • 比较特殊,介于行锁和表锁之间,所以他的能力都是介于两者之间的,就是

粒度比较 表级锁 > 页锁 > 行锁

而他的并发度也就是一般般了。但是他会出现死锁,这三个当中,看来也就只有表锁不会出现死锁了。

我们在这里已经算是对锁机制大致有了个了解,我们再细致的看一下

表锁

表锁实际上分为2种类型,

  • 读锁定
  • 写锁定

而这两种锁定,又是通过其内部的队列来进行维护的,

  • 当前读锁队列 (Current read-lock queue)
  • 挂起的读锁队列(Pending read-lock queue)
  • 挂起写锁队列(Pending write-lock queue)
  • 当前写锁队列(Current write-lock queue)

什么意思呢?

当前读锁的队列,实际上就是包含了当前所有的持有读锁的线程,这里面的内容就是按照获取锁的时间进行有序的排放,

而挂起的读锁队列中存放的则是等待获取所得线程。

那写锁大家肯定也知道是什么意思了,就像是个4*100接力一样。拿着“棒子”的,就是当前读/写锁队列,等着接 “棒子” 的就是 挂起的读/写锁队列。

行锁

MySQL的 InnoDB 存储引擎支持行级锁,InnoDB 的行锁是通过给索引项加锁实现的。

这句话说明了什么?

说明了一件事:只有通过索引条件检索数据时,InnoDB 才使用行锁,否则使用表锁。

是不是感觉很诧异,但是事实上就是这样的。

InnoDB 级别的行锁也是分成了两种

  • 共享锁
  • 独占锁

共享锁和独占锁(Shared and Exclusive Locks),InnoDB 通过共享锁和独占锁两种方式实现了标准的行锁。共享锁(S 锁):允许事务获得锁后去读数据,独占锁(X 锁):允许事务获得锁后去更新或删除数据。一个事务获取的共享锁 S 后,允许其他事务获取 S 锁,此时两个事务都持有共享锁 S,但是不允许其他事务获取 X 锁。如果一个事务获取的独占锁(X),则不允许其他事务获取 S 或者 X 锁,必须等到该事务释放锁后才可以获取到

很多读者肯定也都了解的很深入,肯定还有其他的,对,还有一种就是意向共享锁和意向独占锁。

这种意向共享锁和意向独占锁的意思就是如果我需要一个共享锁,但是这个共享锁这时候正锁定这资源,那我自己就可以加一个共享锁,只能等这个共享锁释放之后,我才能锁定,这个锁就可以称之为意向共享锁,同理,独占锁也是一样的。

而他们之间的逻辑关系是这个样子的。

数据库锁表的原因

其实最简单的就是会出现在 insert、update、delete 这些操作的并发操作上,当我们使用多个数据库连接的时候,同时对一个表中的数据进行更新的操作的时候,那么速度就会对应的变慢,如果持续一段时间之后,那么就会出现锁表的现象了。

那么都有哪些操作会导致出现锁表呢?

(1) 插入查询的语句

insert into table values select xxxx from table2 

这种情况就会锁住table2.

(2) 更新并发操作

update table1 table2 set table1.name = ‘xxx’ where table1.id = table2.id 

这样也会导致锁表。

怎么样降低锁表的情况?

MyISAM表锁的优化:

  • 缩短锁定的时间:这么说吧,实际上最简单的就是加索引,让你的索引利用最大化,
  • 合理利用读写优先级:写优先,读其次。

Innodb行锁的优化

  • 加索引,让查询走索引
  • 学会控制事务
  • 隔离级别不要随便设置,根据不同情况不同选择就可以了

标签:表锁,独占,行锁,队列,数据库,机制,锁定,共享
From: https://www.cnblogs.com/myf008/p/18450285

相关文章

  • 基于Springboot+Vue的线上课堂系统(含源码数据库)
    1.开发环境开发系统:Windows10/11架构模式:MVC/前后端分离JDK版本:JavaJDK1.8开发工具:IDEA数据库版本:mysql5.7或8.0数据库可视化工具:navicat服务器:SpringBoot自带apachetomcat主要技术:Java,Springboot,mybatis,mysql,vue2.视频演示地址3.功能系统中......
  • Redis:高性能的内存数据库
    Redis,全称是RemoteDictionaryServer,是一个开源的内存数据结构存储系统。它可以用作数据库、缓存和消息中间件,支持多种数据结构,如字符串、哈希、列表、集合和有序集合等。Redis以其高性能、丰富的数据类型和强大的功能,广泛应用于各种互联网应用中。一,Redis的核心特性......
  • mongodb(数据库)
    进入mongodb数据库管理系统本地进入mongo远程进入mongo-host=127.0.0.1-p=27017退出exit;查看数据库showdbs-----默认进入test的数据库里面创建数据库/选择数据库usemydb查看你现在使用的是哪个数据库db删除数据库db.dropDatabase()查看集合showcollection......
  • php网站怎么连接数据库配置文件
    在PHP网站中连接数据库通常需要一个配置文件来存储数据库连接信息。以下是创建和使用数据库配置文件的详细步骤:1.创建数据库配置文件创建配置文件:在项目的根目录或适当的位置创建一个配置文件,例如 config.php。编写配置信息:在 config.php 文件中编写数据库连接......
  • php连接数据库的基本步骤是什么
    使用PHP连接数据库的基本步骤如下:1.创建数据库配置文件创建配置文件:在项目的根目录或适当的位置创建一个配置文件,例如 config.php。编写配置信息:在 config.php 文件中编写数据库连接信息。示例配置文件内容如下:<?php//数据库配置文件//数据库类型de......
  • php连接数据库mysql配置
    使用PHP连接MySQL数据库通常涉及以下几个步骤:创建配置文件、引入配置文件、创建数据库连接、执行SQL查询以及关闭连接。下面是一个详细的示例:1.创建数据库配置文件(config.php)创建配置文件:在项目的根目录或适当的位置创建一个配置文件,例如 config.php。编写配......
  • 宝塔数据库启动不了怎么办呢
    如果宝塔面板中的数据库无法启动,可以按照以下步骤进行排查和解决:1.检查错误日志查看日志:登录宝塔面板。进入“软件管理”,找到相应的数据库(如MySQL)。点击“设置”->“错误日志”,查看具体的错误信息。2.检查数据库配置检查配置文件:找到数据库的配置文件(如MySQ......
  • 宝塔数据库老是自动停止怎么解决
    宝塔数据库经常自动停止可能是由于多种原因引起的。以下是一些常见的排查和解决方法:1.检查错误日志查看日志:登录宝塔面板。进入“软件管理”,找到相应的数据库(如MySQL)。点击“设置”->“错误日志”,查看具体的错误信息。2.检查配置文件检查配置文件:找到数据库......
  • 网站连接数据库配置文件
    网站连接数据库的配置文件通常包含数据库连接所需的各项参数。这些参数包括数据库类型、主机地址、端口号、数据库名称、用户名和密码等。下面是一些常见的数据库配置文件示例:MySQL配置文件示例假设你使用的是PHP语言,以下是一个典型的MySQL数据库配置文件(db_config.php)......
  • 消费者Rebalance机制
    优质博文:IT-BLOG-CN一、消费者Rebalance机制在ApacheKafka中,消费者组ConsumerGroup会在以下几种情况下发生重新平衡Rebalance:【1】消费者加入或离开消费者组:当一个新的消费者加入消费者组或一个现有的消费者离开消费者组时,Kafka会触发重新平衡,以重新分配分区给消费者......