数据库mysql的锁有哪几种(mysql数据库的锁有多少种)

  • 1、mysql中锁的类型有哪些
  • 2、mysql数据库的行级锁有几种
  • 3、MySQL从入门到精通(九) MySQL锁,各种锁

全局锁

顾名思义,全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。

表级锁

MySQL 里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)。

表锁

表锁的语法是 lock tables … read/write。与 FTWRL 类似,可以用 unlock tables 主动释放锁,也可以在客户端断开的时候自动释放。需要注意,lock tables 语法除了会限制别的线程的读写外,也限定了本线程接下来的操作对象。

元数据锁

MDL 不需要显式使用,在访问一个表的时候会被自动加上。MDL 的作用是,保证读写的正确性。你可以想象一下,如果一个查询正在遍历一个表中的数据,而执行期间另一个线程对这个表结构做变更,删了一列,那么查询线程拿到的结果跟表结构对不上,肯定是不行的。

有两种模式的行锁:

1)共享锁:允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。

( Select * from table_name where ……lock in share mode)

2)排他锁:允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和 排他写锁。(select * from table_name where…..for update)

锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,除传统的计算资源(CPU、RAM、I/O)争用外,数据也是一种供许多用户共享的资源,如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素,从这个角度来说,锁对数据库而言是尤其重要,也更加复杂。MySQL中的锁,按照锁的粒度分为:1、全局锁,就锁定数据库中的所有表。2、表级锁,每次操作锁住整张表。3、行级锁,每次操作锁住对应的行数据。

全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将阻塞。其典型的使用场景就是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。但是对数据库加全局锁是有弊端的,如在主库上备份,那么在备份期间都不能执行更新,业务会受影响,第二如果是在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志,会导致主从延迟。

解决办法是在innodb引擎中,备份时加上–single-transaction参数来完成不加锁的一致性数据备份。

添加全局锁: flush tables with read lock; 解锁 unlock tables。

表级锁,每次操作会锁住整张表.锁定粒度大,发送锁冲突的概率最高,并发读最低,应用在myisam、innodb、BOB等存储引擎中。表级锁分为: 表锁、元数据锁(meta data lock, MDL)和意向锁。

表锁又分为: 表共享读锁 read lock、表独占写锁write lock

语法: 1、加锁 lock tables 表名 … read/write

2、释放锁 unlock tables 或者关闭客户端连接

注意: 读锁不会阻塞其它客户端的读,但是会阻塞其它客户端的写,写锁既会阻塞其它客户端的读,又会阻塞其它客户端的写。大家可以拿一张表来测试看看。

元数据锁,在加锁过程中是系统自动控制的,无需显示使用,在访问一张表的时候会自动加上,MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。为了避免DML和DDL冲突,保证读写的正确性。

在MySQL5.5中引入了MDL,当对一张表进行增删改查的时候,加MDL读锁(共享);当对表结构进行变更操作时,加MDL写锁(排他).

查看元数据锁:

select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema_metadata_locks;

意向锁,为了避免DML在执行时,加的行锁与表锁的冲突,在innodb中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。意向锁分为,意向共享锁is由语句select … lock in share mode添加。意向排他锁ix,由insert,update,delete,select。。。for update 添加。

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_lock;

行级锁,每次操作锁住对应的行数据,锁定粒度最小,发生锁冲突的概率最高,并发读最高,应用在innodb存储引擎中。

innodb的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁,对于行级锁,主要分为以下三类:

1、行锁或者叫record lock记录锁,锁定单个行记录的锁,防止其他事物对次行进行update和delete操作,在RC,RR隔离级别下都支持。

2、间隙锁Gap lock,锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事物在这个间隙进行insert操作,产生幻读,在RR隔离级别下都支持。

3、临键锁Next-key-lock,行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap,在RR隔离级别下支持。

innodb实现了以下两种类型的行锁

1、共享锁 S: 允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。

2、排他锁 X: 允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。

insert 语句 排他锁 自动添加的

update语句 排他锁 自动添加

delete 语句 排他锁 自动添加

select 正常查询语句 不加锁 。。。

select 。。。lock in share mode 共享锁 需要手动在select 之后加lock in share mode

select 。。。for update 排他锁 需要手动在select之后添加for update

默认情况下,innodb在repeatable read事务隔离级别运行,innodb使用next-key锁进行搜索和索引扫描,以防止幻读。

间隙锁唯一目的是防止其它事务插入间隙,间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用的间隙锁。

原创文章,作者:TOPG7,如若转载,请注明出处:https://www.506064.com/n/126865.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
TOPG7的头像TOPG7
上一篇 2024-10-03 23:13
下一篇 2024-10-03 23:13

相关推荐

  • QtXcb:一个全能的跨平台C++库

    一、QtXcb概述 QtXcb是一个由Qt开发团队开发的跨平台C++库,它提供了一系列X Window系统的编程接口,使得开发者能够基于QtXcb进行X11应用程序的开发,同时也为…

    编程 2024-10-04
  • 详解mysql不等于null的作用

    一、非空判断的语法 在mysql中,经常需要判断字段是否为null,判断方法就是使用”IS NULL”和”IS NOT NULL”。…

    编程 2024-10-04
  • 修改mysql数据库参数(mysql数据库参数设置和调整)

    本文目录一览: 1、如何修改MySQL导入数据库文件最大限制2048KB的方法 2、易语言修改mysql数据库内容 3、如何修改mysql数据库的max 4、超详细MySQL数据库…

    编程 2024-12-09
  • java过滤器,java过滤器和拦截器的区别和使用场景

    本文目录一览: 1、java web 过滤器跟拦截器的区别和使用 2、JAVA过滤器和拦截器的区别有哪些? 3、什么是java过滤器! 它的功能和作用是什么啊? 4、java语言中…

    编程 2024-10-04
  • 抢茅台脚本 – 从使用到原理

    一、抢茅台脚本ios 抢茅台脚本ios是一种可以帮助用户自动刷新茅台酒相关商品页面从而提高购买成功率的技术手段。它可以让用户跳过看到买不到的茅台酒的痛苦,方便快捷地进行抢购。 在使…

    编程 2024-12-10
  • Java判断数据类型的方法

    Java是一门强类型语言,数据类型是Java中非常重要的概念之一。判断数据类型是Java中经常用到的操作之一,针对不同的数据类型,Java提供了不同的方法来判断其具体类型。本文将介…

    编程 2024-11-27
  • 关于字符间距优化的技巧

    字符间距指的是字符之间的空隙,它对于文本的可读性和设计感都有很大的影响。当我们在设计网页时,字符间距的优化也是非常重要的一个方面。本文将从字体选择、字号设置、行高调整和字间距控制四…

    编程 2024-11-10
  • 如何为Linux系统分配磁盘空间

    一、fdisk命令介绍 在Linux系统中,可以使用fdisk命令来对磁盘进行分区和分配空间。下面是一个示例代码: sudo fdisk /dev/sdb n p 1 [enter…

    编程 2024-11-10
  • python脚本爬虫程序(python编程爬虫)

    1、如何利用python写爬虫程序 2、Python编程基础之(五)Scrapy爬虫框架 3、如何利用python写爬虫程序? 利用python写爬虫程序的方法: 1、先分析网站内…

    编程 2024-10-03
  • 两个list合并

    一、认识list Python中的list是一种有序的、可变的、元素可以有重复的容器。其常见的操作包括索引访问、切片、添加/删除/替换元素等。要实现两个list的合并,首先需要对l…

    编程 2024-10-04

发表回复

登录后才能评论