我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Mysql锁

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Mysql锁

锁是用来解决并发事务的访问问题,我们已经知道事务并发执行时可能带来的各种问题,最大的一个难点是:一方面要最大程度地利用数据库的并发访问,另外一方面还要确保每个用户能以一致的方式读取和修改数据,尤其是一个事务进行读取操作,另一个同时进行改动操作的情况下。一个事务进行读取操作,另一个进行改动操作,我们前边说过,这种情况下可能发生脏读、不可重复读、幻读的问题。

全局锁

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

解锁语句UNLOCK TABLES;

表级锁

共享锁,又称读锁,简称 S 锁。当事务对数据加上读锁后,其他事务只能对该数据加读锁,不能加写锁。

排他锁,又称为写锁,简称 X 锁,当事务对数据加上排他锁后,其他事务无法对该数据进行查询或者修改

MySQL InnoDB引擎默认 update,delete,insert 都会自动给涉及到的数据加上排他锁,select 语句默认不会加任何锁类型。

表锁

表锁的语法是lock tables … read/write。可以用unlock tables主动释放锁,也可以在客户端断开的时候自动释放。lock tables语法除了会限制别的线程的读写外,也限定了本线程接下来的操作对象
如果在某个线程A中执行lock tables t1 read,t2 wirte;这个语句,则其他线程写t1、读写t2的语句都会被阻塞。同时,线程A在执行unlock tables之前,也只能执行读t1、读写t2的操作。连写t1都不允许

元数据锁

MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据的一致性,有活动事务的时候,不可以对元数据进行写入操作。

在MySQL5.5版本引入了MDL,当对一个表做增删改查操作的时候,加MDL读锁;当要对表做结构变更操作的时候,加MDL写锁。读锁之间不互斥,因此可以有多个线程同时对一张表增删改查。

读写锁之间、写锁之间是互斥的,用来保证变更表结构操作的安全性。因此,如果有两个线程要同时给一个表加字段,其中一个要等另一个执行完才能开始执行

意向锁

意向锁是表锁,为了协调行锁和表锁的关系,支持多粒度(表锁与行锁)的锁并存,当有事务A有行锁时,MySQL会自动为该表添加意向锁,事务B如果想申请整个表的写锁,那么不需要遍历每一行判断是否存在行锁,而直接判断是否存在意向锁,增强性能。如何表锁和意向锁是兼容的就会加上,排斥的情况下就会处于等待状态下。

行级锁

行级锁是 MySQL 粒度最细的锁,发生锁冲突概率最低,但是加锁慢,开销大,MySQL 中只有 InnoDB 引擎支持行锁,其他不支持

行锁

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

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

间隙锁、临键锁

乐观锁悲观锁

乐观锁

乐观锁,顾名思义,就是非常乐观,乐观锁认为数据一般情况下不会造成冲突,所以在数据提交更新的时候才会去检测。乐观锁是基本版本号机制实现的,数据表中增加一个 version 字段,读取数据时将 version 一起读出。数据每更新一次,version 字段值 + 1。当修改需要提交时,将读取时的版本号与数据库当前版本号做比较,如果一致,说明在此期间无人修改这条记录,不一致则说明已经被修改了,提交失败。

添加乐观锁插件

@Configurationpublic class MybatisPlusInterceptorConfiguration {    @Bean    public MybatisPlusInterceptor mybatisPlusInterceptor(){        MybatisPlusInterceptor mybatisPlusInterceptor=new MybatisPlusInterceptor();        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());        return mybatisPlusInterceptor;    }}

在MybatisPlus中只需要在实体类version字段中加@Version注解就可以实现乐观锁了

悲观锁

悲观锁是相比较乐观锁而言的,就是比较悲观,悲观锁认为数据每次操作都会被修改,所以在每次操作数据时都会加上锁。悲观锁通过共享锁和排他锁实现。

来源地址:https://blog.csdn.net/qq_43649937/article/details/129478813

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Mysql锁

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

2023-09-10
2023-10-25

Mysql 表锁

二.创建示例表: create table mylock( id int not null primary key auto_increment, name varchar(20) )engine myisam; insert into mylock(name
Mysql 表锁
2022-01-29

mysql锁表怎么解锁

要解锁 mysql 中锁定的表,请执行以下步骤:确定锁定的表:使用 show processlist 命令。杀掉锁定线程:使用 kill 命令。使用 unlock tables 语句:使用 unlock tables 语句解锁所有锁定的表
mysql锁表怎么解锁
2024-05-30

MySQL死锁

https://dev.mysql.com/doc/refman/5.7/en/innodb-deadlocks.html什么是mysql的死锁?A deadlock is a situation where different transactions ar
2014-12-11

MySQL的锁机制——记录锁、间隙锁、临键锁

记录锁(Record Locks) 记录锁锁住的是索引记录,记录锁也叫行锁。如果使用索引作为条件命中了记录,那么就是记录锁,被锁住的记录不能被别的事务插入相同的索引键值,修改和删除。 例如: select * from test_table
2023-08-18

【MySQL】锁之InnoDB

纸上得来终觉浅,绝知此事要躬行。InnoDB行锁开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。InnoDB 实现了以下两种类型的行锁。共享锁(S):又称为读锁,简称S锁,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数
【MySQL】锁之InnoDB
2020-11-14
2023-09-05

Mysql锁机制中行锁、表锁、死锁如何实现

这篇文章主要介绍了Mysql锁机制中行锁、表锁、死锁如何实现,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、Mysql锁是什么?锁有哪些类别?锁定义: 同一时间同一资
2023-06-29

编程热搜

目录