一、前言

  刚开始学习MySQL中锁的时候,网上一查出来一堆,什么表锁、行锁、读锁、写锁、悲观锁、乐观锁等等等,直接整个人就懵了。好多文章都尽量把很多锁给列举一遍,生怕写少了内容不够丰富,有的连死锁、分布式锁都给写上了。其实给这些锁归归类,就清楚很多了!本篇文章只聊共享锁和排他锁,不过我们也不妨先看下锁分类。

二、锁分类

1. 按粒度

按照锁粒度划分,可以将锁划分成行锁页锁表锁

这里只解释下行锁:按照行的粒度对数据进行锁定,锁定粒度小,发生锁冲突概率低,可以实现并发都高。但是对于锁的开销比较大,加上会比较慢;在程序中控制不好,可能出现死锁的情况。

说到粒度,顺带说下InnoDB 存储引擎的逻辑结构:所有数据都被逻辑地存放在一个空间内,称为表空间,而表空间由段(sengment)、区(extent)、页(page)组成。

2. 按机制

共享锁(S):又称为读锁,多个事务可以一起读,但都不能写(这里有个细节,如果只有当前事务加了共享锁,那么该事务可以写。),共享锁之间不互斥,共享锁会阻塞排它锁。
排他锁(X):又称为写锁,允许获得排他锁的事务更新数据,但是阻止其他事务获得相同数据集的共享锁和排他锁。

3. 按场景

这个跟MySQL没有直接性的关系,只是人们使用锁碰到的问题、或者使用程序解决具体场景的一些锁概念:悲观锁乐观锁分布式锁死锁

三、使用方式

  • 共享锁
-- 对表加共享锁
LOCK TABLE product_comment READ;
-- 对表释放共享锁
UNLOCK TABLE;-- 对数据集加共享锁
SELECT * FROM table_name WHERE ... lock in share mode;
  • 排他锁
-- 对表加排他锁
LOCK TABLE product_comment WRITE;
-- 对表释放排他锁
UNLOCK TABLE;-- 对数据集加排他锁
SELECT * FROM table_name WHERE ... for update;

1.对于UPDATE、DELETE、INSERT语句,自动给相关数据加上排他锁。
2.如果数据集过滤条件中不走索引的话,会给全表加锁。

四、实验

1. 共享锁不能写

A事务

begin;
SELECT * FROM user WHERE id = 1 lock in share mode;
update user set name = 'jsk' where id =1;
commit;

B事务

begin;
SELECT * FROM user WHERE id = 1 lock in share mode;
commit;

如果仅执行事务A中的语句,是可以顺利完成的。这里可以证明:只有当前事务加了共享锁,那么该事务可以写。
如果仅执行事务A中的前两行,然后执行事务B中前两行,再回头继续执行事务A中的第三行。此时,会一直卡在这里!
这里可以证明:数据行上有共享锁存在,就不能加上排他锁,即不能有写操作。(上面提到过,写操作会自动加上排他锁)

Mysql中的共享锁和排他锁相关推荐

  1. MySQL中的共享锁与排他锁

    2019独角兽企业重金招聘Python工程师标准>>> 在MySQL中的行级锁,表级锁,页级锁中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突.行 ...

  2. mysql排他锁和共享锁视频_分享MySQL 中的共享锁和排他锁的用法

    在 MySQL 中的行级锁.表级锁和页级锁中,咱们介绍过,行级锁是 MySQL 中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突.行级锁分为共享锁和排他锁两种,本文将详细介绍共享锁和排他锁的概 ...

  3. 一文搞懂 mysql 中的共享锁、排他锁、悲观锁、乐观锁及使用场景

    目录 一.常见锁类型 二.Mysql引擎介绍 三.常用引擎间的区别 四.共享锁与排他锁 五.排他锁的实际应用 六.共享锁的实际应用 七.死锁的发生 八.另一种发生死锁的情景 九.死锁的解决方式 十.意 ...

  4. mysql 事务排他锁_[数据库事务与锁]详解六: MySQL中的共享锁与排他锁

    注明: 本文转载自http://www.hollischuang.com/archives/923 在MySQL中的行级锁,表级锁,页级锁中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大 ...

  5. mysql 的独占锁和排它锁_数据库中的共享锁与排他锁

    摘要: 能修改数据.为什么要加锁很多人都知道,锁是用来解决并发问题的,那么什么是并发问题呢?并发情况下,不加锁会有什么问题呢?拿生活中的洗手间举例子,每个洗手间都会有一个门,并且是可以上锁的,当我们进 ...

  6. mysql排他锁怎么用_MySQL 中的共享锁和排他锁的用法

    在 MySQL 中的行级锁.表级锁和页级锁中,咱们介绍过,行级锁是 MySQL 中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突.行级锁分为共享锁和排他锁两种,本文将详细介绍共享锁和排他锁的概 ...

  7. mysql 排它锁_Mysql共享锁、排他锁、悲观锁、乐观锁

    一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |--排他锁(X锁,MyISAM 叫做写锁) |--间隙锁( ...

  8. MySQL数据库的共享锁和排他锁

    MySQL数据库的锁,按照作用范围划分为: 行级锁.页级锁和表级锁,行级锁是锁定粒度最细的一种锁,能大大减少数据库操作的冲突.行级锁又分为共享锁和排他锁两种,本文将详细介绍共享锁和排他锁的概念.使用方 ...

  9. Java中的共享锁和排他锁(以读写锁ReentrantReadWriteLock为例)

    重要声明:本人之前对java中的读写锁也不是非常了解,用的也不是很多,尤其在读写锁的策略原理一块没有深究过,本篇文章是在学习[玩转Java并发工具,精通JUC,成为并发多面手]课程后写的,故文章类型选 ...

最新文章

  1. 3D点云two-stage目标检测方法优化综述
  2. 视频导切台控制说明:RGBLink MiniPro初步测试
  3. 程序员所应具备的品质
  4. WIN32 使用 MUTEX 实现禁止多开
  5. 阿里一年,聊聊我成长了什么,入职阿里的职业生涯感悟
  6. 不可思议的素数(上)(文末送书)
  7. 代码审计系列篇一之代码审计学习思路
  8. screen中文乱码问题的解决
  9. Array.prototype.slice.call()如何工作?
  10. 数据分析【实践】——AB测试的应用、案例及关键点
  11. 一个技术工作者的四大核心价值理念
  12. 使用jQuery快速高效制作网页交互特效 第三章 上机练习三 制作课工场论坛发帖
  13. 绝对值信号的编码器有哪些信号输出(三、四)
  14. 微信小程序:开发相关
  15. Eeid—ligerUI学习(1)[首页布局]
  16. 做个男人,做个成熟的男人,做个有城府的男人
  17. win7计算机剩余空间,WIN7 C盘空间越来越小解决方法
  18. 【读书笔记】《牧羊少年奇幻之旅》
  19. 人人影视 for Mac(美剧电影必备神器)
  20. Android6.0 ios,意超越iOS9!谷歌寄希望于Android6.0系统

热门文章

  1. 杰里之烧录使用 VBAT 供电,供电电压 4.2V【篇】
  2. Java文件下载FileNotFoundException: G:\xxx 拒绝访问异常
  3. centos 重启服务命令
  4. ds90cr286调试新得
  5. 位移操作符 <<左移 与 >>右移 的基本逻辑
  6. mysql里面如何获取行号_mysql如何获取行号
  7. C++带特殊符号的标准输入读取方法
  8. canvas绘制简单动画思路总结
  9. 【华为机试真题Java】提取不重复的整数
  10. deepin/UOS没有1920*1080