首页 > 数据库 >Mysql的锁机制

Mysql的锁机制

时间:2023-02-02 10:01:22浏览次数:48  
标签:行锁 lock 记录 阻塞 死锁 Mysql 机制 表锁


Mysql的锁机制是除了Mysql的MVCC机制外,解决并发过程的幻读等问题的另外的方案,当然性能比mvcc机制较低,因为不允许读写操作并列执行,但是一些特殊机制,必须使用Mysql的锁方案

锁的分类以及CRUD操作下,锁的操作

锁分为S锁和X锁,S锁不会阻塞其他事务请求S锁,而X锁将阻塞其他事务的请求

锁定读

#添加S锁,S锁不会阻塞S锁的请求
begin;
select *from computer lock in share mode;
#添加X锁
begin;
select *from computer limit 5 for update \G;
#获取锁,失败则跳过
begin
select *from s2 limit 5 for update skip locked;
begin
select *from s2 limit 5 for update nowait;

写操作

delete

先进行定位数据位置,获取X锁,获取成功后,进行数据的delete mark操作,记录下删除的数据

insert

插入新的记录,会对新插入的数据加一个隐式锁,防止被其他记录访问到

update

修改了键值时候,会先对记录删除后再插入

未修改键值时:若存储空间未变化,先定位后,用获取X锁,进行修改操作

变化之后,获取记录的X锁,再插入新的数据

锁的粒度

从锁的粒度来看,锁的粒度大小分为行锁和表锁,页锁,表锁不会导致死锁,而行锁可能导致死锁,且inndb引擎支持行锁,而Myisam不支持行锁,只支持表锁(一个事务将锁定整张表,并发能力低)。

1 表级别的锁

inndb锁的锁表语句

1全阻塞的锁表语法

#锁表语句,不建议使用,加s锁
lock tables userbea read;
#锁定写,加X锁
lock tables userbea write;

2 意向锁

inndb支持多粒度级别的锁,支持表级别和行级别锁,而意向锁就是表锁,特点是不会阻塞其他事务的不同数据行

#意向共享锁(intention shared lock, IS):事务有意向对表中的某些行加共享锁(S锁)
select *from computer lock in share mode;
#意向排他锁(intention exclusive lock, IX):事务有意向对表中的某些行加排他锁(X锁)
select *from computer limit 5 for update;

3 自增锁

4 元数据锁(MDL)

MySQL5.5引入了meta data lock,简称MDL锁,属于表锁范畴。MDL 的作用是,保证读写的正确性。比如,如果一个查询正在遍历一个表中的数据,而执行期间另一个线程对这个表结构做变更,增加了一列,那么查询线程拿到的结果跟表结构对不上,肯定是不行的。因此,当对一个表做增删改查操作的时候,加 MDL读锁;当要对表做结构变更操作的时候,加 MDL 写锁

#查看是否有表被锁定
show open tables where in_use>0;
#释放表
unlock tables;

Mysql的锁机制_database

Mysql的锁机制_database_02

Mysql的锁机制_database_03

 锁的总结

Mysql的锁机制_死锁_04

行锁

行锁是针对数据行级别的锁,只有inndb支持行锁,并发能力高,冲突发生低,加锁慢

记录锁(record locks)

记录锁也分为X锁和S锁,从定义上看,与表锁的X锁和S锁是相同的,只是针对行级别进行处理

间隙锁(gaps locks)

是在一条记录的前加入间隙锁(插入于不存在的间隙),使新的数据无法插入这两条记录之间,仅仅防止幻影的产生(注意,如果间隙锁锁住了最大的记录x之外的记录可能产生到无穷区间的间隙锁)

临键锁(Next-key locks)

记录锁和间隙锁的结合体,既能锁住该条记录又能锁住前面的记录

插入意向锁(Insert Intention locks)

插入意向锁会生成类似gap锁的结构,但不会阻止其他事务获取数据

页锁

介于表锁和行锁之间,并发度一般

锁的态度区分

悲观锁

阻塞其他线程获取数据,适用于多写的应用

乐观锁

不阻塞其他线程,使用版本号和时间戳机制来判断更新前后是否有其他数据更新数据(使用CAS机制),适用于多读的应用

Mysql的锁机制_死锁_05

 

加锁的方式

显式锁

隐式锁

死锁

死锁是两个事务互相争夺对方资源,并锁定对方请求的资源

Mysql的锁机制_数据_06

 

死锁的处理策略:

1.等待超时回滚 当事务被阻塞超过时间后,会报超时错误,自动回滚

2.死锁检测    将持有最少行级的排它锁事务回滚(但是会降低系统的吞吐量,建议在大的并发下,关闭死锁检测)

锁的监控

 监控inndb引擎 

Mysql的锁机制_死锁_07

监控正在被阻塞语句

SELECT * FROM information_schema.INNODB_TRX\G;

Mysql的锁机制_数据_08

 

Mysql的锁机制_mysql_09

查询锁等待的情况 

SELECT * FROM performance_schema.data_lock_waits\G

Mysql的锁机制_死锁_10

 

标签:行锁,lock,记录,阻塞,死锁,Mysql,机制,表锁
From: https://blog.51cto.com/u_15063934/6032817

相关文章

  • mysqldump 与 mysqlpump
    简介:mysqldump与mysqlpump都是mysql自带的备份工具。mysqlpump是mysqldump的一个衍生,本身也参考了mydumper的思路,支持了并行导出数据,因此导出数据的效率比mysqldu......
  • Mysql远程连接
    阿里云系统ubuntu16.041.将/etc/mysql/mysql.conf.d/mysqld.cnf中的bind-address注释掉2.进入mysql,输入命令GRANTALLPRIVILEGESON.TO'root'@'%'IDENTIFIEDBY......
  • mysql删库勒索
    看到黑客派里有人遇到了这事,我虽然还没遇到过,还是预防一下比较好1.数据库备份通过写脚本来达成每天备份数据库的习惯2.防止root用户的公网访问,使用SSH的连接方式3.......
  • 63linux安装and卸载mysql
    配置腾讯云+centos7卸载mysql1.rpm-qa|grep-imysql2.rpm-e--nodeps上面查询的结果(全部要删除)安装MySQL8以下版本1.在root目录下,安装mysql和m......
  • 揭秘运营商数据中心的物理层高可用机制,竟如此简单细节!
    如何设计高可靠的物理架构?以运营商数据中心组网为例对于云计算这个名词,相信大家都不会陌生,这个词不但讲了很多年,而且我相信,未来几年后一定还会继续讲。本......
  • Python连接MySQL数据库
    Python连接MySQL数据库安装MySQL参考链接安装NavicatPremium16参考链接连接MySQL安装库pipinstallpymysqlMySQL封装#!/usr/bin/envpython#-*-coding:ut......
  • mysql字符串函数 lpad() : 补‘0’没有显示,补‘1’显示的情况
    更新时使用lpad():补‘0’没有显示,补‘1’显示的,发生这种情况的原因可能是在使用lpad()函数时,第一个参数的字段类型不是字符类型,例如是int类型的字段,那么填充'0'是不会生......
  • mysql-聚合函数
    一、聚合函数1.常见的几个聚合函数1.1AVG/SUMAVG:求平均数SUM:求总和selectAVG(salary),SUM(salary)fromemployees;1.2MAX/MINmax/min:适用于时间类型,字符......
  • MySQL基础-函数
    1.介绍函数是指一段可以直接被另一段程序调用的程序或代码。2.常用字符串函数 案例:根据需求完成以下SQL编写由于业务需求变更,企业员工的工号,统一为......
  • MySQL 索引
    1.索引是什么?  索引是一种能提高数据库查询效率的数据结构。它可以比作一本字典的目录,可以帮你快速找到对应的记录。索引一般存储在磁盘的文件中,它是占用物理空间......