从头开始搞懂mysql(05)行锁表锁全局锁(代码片段)

一起来搬砖呀 一起来搬砖呀     2022-12-05     548

关键词:

1、行锁

行锁是针对数据表中行记录的锁,MySQL 的行锁是在引擎层实现的,并不是 所有的引擎都支持行锁,比如 MyISAM 就不支持,InnoDB 支持行锁,避免了并发控制时使用表锁

1.1 两阶段锁

在 InnoDB 事务中,行锁是在需要的时候才被加上的,但并不是不需要了就立刻释放,而是等待事务结束后释放,这个就是两阶段锁协议

如果我们的事务中需要锁多个行,需要把可能造成锁冲突、可能影响并发度的锁尽量往后放,根据两阶段锁协议,不论怎样安排语句顺序,所有操作需要的行锁都是在事务提交的时候释放的,我们要最大程度的减少事务之间的锁等待,提高并发度。

1.2 死锁和锁检测

当系统中不同的线程中出现了循环资源依赖,涉及的线程等都在等待别的线程释放资源,就会导致线程进入无限循环等待的状态,称为死锁

下图举例数据库中的死锁

事务 A 在等待事务 B 释放 id = 2 的行锁,事务 B 在等待事务 A 释放 id = 1 的行锁,互相等待对方的资源释放,进入了死锁状态。

减少死锁的主要方向就是控制访问相同资源的并发事务量

进入死锁状态有两种策略:

  • 进入等待,直到超时,超时时间通过 innodb_lock_wait_timeout 来设置,默认 50s

  • 主动检测死锁,发现死锁后主动回滚某一个事务,让其它事务继续执行,参数 innodb_deadlock_detect 设置为 on 开启,默认为 on

2、表锁

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

表锁一般在数据库引擎不支持行锁的时候才会使用到

2.1 lock

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

比如线程 A 执行 lock tables test1 read, test2 write; 的话,其他线程写 test1、读写 test2 的语句都会被阻塞,同时,线程 A 在 unlock tables 之前,也只能执行读 test1、读写 test2 的操作,也不能访问其它表

2.2 MDL(meta data lock)

MDL 不用显式使用,在访问一个表的时候会自动加上。MDL 作用是保证读写的正确性,对一个表做 CRUD 的时候,加 MDL 读锁,对表结构变更时,加 MDL 写锁

MDL 会直到事务提交才释放,在做表结构变更时,要注意,不要导致锁住线上查询和更新

MDL 读锁之间不互斥,所以可以有多个线程对一张表进行 CRUD,写锁是互斥的,保证变更表结构的安全性

3、全局锁

全局锁就是对整个数据库实例加锁,MySQL 让整个数据库处于只读的命令 flush tables with read lock(FTWRL) 使用该命令后,其他线程的更新语句、数据定义语句和更新类事务提交语句都会被阻塞

3.1 FTWRL

使用 FTWRL 命令后,如果由于客户端异常而断开连接,MySQL 会自动释放这个全局锁,整个库回到正常状态

全局锁的典型使用场景就是做全库逻辑备份,通过 FTWRL 保障不会有其它线程对数据库做更新,数据库处于只读状态,然后对整个库做备份

如果这样的话,在主库上备份,备份期间都不能执行更新,在从库上备份,从库不能执行主库同步的 binlog,导致主从延迟

如果不加锁的话,备份系统备份得到的库不是一个逻辑时间点,视图是逻辑不一致的

3.2 mysqldump

当然,FTWRL 比较适用于不支持事务的引擎,对于支持事务的引擎,我们可以使用官方自带的逻辑备份工具 mysqldump,当 mysqldump 使用参数 -single-transaction 的时候,导数据之前就会启动一个事务,确保拿到一致性视图。由于 MVCC 的支持,整个过程是可以正常更新的

mysql-加锁规则(间隙锁临键锁行锁表锁)(代码片段)

...则可重复读隔离级别下加锁规则next-keylock=间隙锁+行锁 原则1:加锁的基本单位是next-keylock。next-keylock是前开后闭区间。原则2:查找过程中访问到的对象才会加锁。原则3:索引上的等值查询,给唯一索引加... 查看详情

mysql:行锁表锁乐观锁悲观锁读锁写锁

...行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎)。行锁锁定整个行数据,开销大,加锁慢,会出现死锁。锁定粒度小,发生锁冲突的概率低,并发度高。表锁锁定整个表数据,开销小,加锁快,不会出现死锁。锁定粒度大... 查看详情

对mysql乐观锁悲观锁共享锁排它锁行锁表锁概念的理解(代码片段)

前言我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致(数据冲突)乐观锁乐观锁不是数据库自带的,需要我们自己去实现。乐观锁是指操作数据库时(更新操作),想法很乐观,认为这... 查看详情

mysql基础篇之全局锁和表锁--06(代码片段)

...范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。今天这篇文章,我会和 查看详情

问答分享第一弹mysql锁总结:mysql行锁表锁排他锁共享锁的特点

大家好,我是小于哥哈。前几天能分享了第一期面试题,MySQL中有哪几种锁和这些锁各有哪些特点,这道面试题是经常会被问到的一个面试题,大家反馈的都挺不错的。今天特此来总结一下。首发于公众号【终端... 查看详情

mysql性能调优08_事务及其acid属性脏读不可重复读幻读隔离级别行锁表锁读锁写锁间隙锁临键锁(代码片段)

...②.脏读、不可重复读、幻读③.隔离级别④.锁分类表索、行锁、读锁、写锁⑤.表锁⑥.行锁⑦.间隙锁(GapLock)⑧.临键锁(Next-keyLocks)①.事务及其ACID属性事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部... 查看详情

mysql悲观锁是行锁还是表锁?(代码片段)

...select*fromtablewherecol=xxforupdate;悲观锁:在事务执行开始加锁,此时其他事务无法读写,等待事务完成,其他事务才可以获得这个 查看详情

mysql悲观锁是行锁还是表锁?(代码片段)

...select*fromtablewherecol=xxforupdate;悲观锁:在事务执行开始加锁,此时其他事务无法读写,等待事务完成,其他事务才可以获得这个 查看详情

mysql中的读锁和写锁(innodb行锁表锁myisam共享读锁myisam独占写锁)

MySql锁(数据库都是悲观锁,java、redis、zookeeper会有乐观锁)锁的概念MySQL中的锁MyISAM锁     MyISAM共享读锁     MyISAM独占写锁     MyISAM锁调度InnoDb  &n 查看详情

mysql存储过程出现锁表锁行的情况怎么解决

行锁的等待在介绍如何解决行锁等待问题前,先简单介绍下这类问题产生的原因。产生原因简述:当多个事务同时去操作(增删改)某一行数据的时候,MySQL为了维护ACID特性,就会用锁的形式来防止多个事务同时操作某一行数据... 查看详情

mysql锁机制表锁和行锁详解

...会阻断其他锁和读锁。从对数据操作的粒度分:表锁行锁表锁( 查看详情

mysql-加锁规则(间隙锁临键锁行锁表锁)(代码片段)

...则可重复读隔离级别下加锁规则next-keylock=间隙锁+行锁 原则1:加锁的基本单位是next-keylock。next-keylock是前开后闭区间。原则2:查找过程中访问到的对象才会加锁。原则3:索引上的等值查询,给唯一索引加... 查看详情

mysql学习笔记(全)(代码片段)

...设置(缓冲,线程参数)Mysql执行顺序手写机读先从from开始SQLJoina表 mysql>select*fromtbl_dept; + 查看详情

重新整理mysql基础篇—————表锁和全局锁[六](代码片段)

前言锁从大的方面可以分为:1.全局锁2.表锁3.行锁正文全局锁全局锁就是对整个数据加上读锁。在mysql中,加入全局锁的命令就是:Flushtableswithreadlock(FTWRL)这个时候会让整个数据库处于只读状态,之后其他线程的数据更新、数据定... 查看详情

mysql全局锁表级锁行级锁(代码片段)

...围,MySQL里的锁大致可以划分为全局锁,表级锁和行锁三类,如下图:[2]全局锁  全局锁是对整个数据库实例加锁。使用了全局锁之后,整个库处于只读状态,其他写操作会被阻塞。  应用场景:... 查看详情

day870.全局锁和表锁-mysql实战(代码片段)

...范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。一、全局锁全局锁是对整个数据库实例 查看详情

mysql数据库锁(代码片段)

...过的锁释放所有表锁注意锁表---写表总结如何分析表锁定行锁行锁演示索引失效会导致行锁变成表锁间隙锁如何锁定某一行行锁总结优化建议页锁总结锁的分类按照对数据操作的类型(读/写)进行分类读锁(共享锁):针对同一份数据... 查看详情

Mysql 表锁代替行锁

】Mysql表锁代替行锁【英文标题】:Mysqltablelockinsteadofrowlocks【发布时间】:2013-12-0205:23:35【问题描述】:Mysql(5.5)Innodb在这种情况下是放置表锁而不是行锁。这会导致对表的其他插入查询失败。这也是更大交易的一部分。Insertintot... 查看详情