共享锁

# 查询语句后添加 lock in share mode 即可添加共享锁 注意:需要先开启事务。
begin;/begin work;/start transaction; (三者选一就可以)
select * from t_user where age = 20 lock in share mode;
commit;/commit work;

对年龄为20岁的用户添加共享锁,使得这些用户在当前事务提交前不会被其他事务修改。但是其他事务仍然可以读取该部分数据,也可以对该部分数据添加共享锁。
当事务同时增加共享锁时候,事务的更新必须等待先执行的事务 commit 后才行,如果同时并发太大可能很容易造成死锁。

排它锁

start transaction;
select * from t_user where age = 20 for update;

排它锁只允许当前事务对锁定的数据进行修改,其他事务无法修改,只能读取,也无法添加共享锁。

表锁

表级锁是mysql锁中粒度最大的一种锁,表示当前的操作对整张表加锁,资源开销比行锁少,不会出现死锁的情况,但是发生锁冲突的概率很大。被大部分的mysql引擎支持,MyISAM和InnoDB都支持表级锁,但是InnoDB默认的是行级锁。

页锁

页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。BDB支持页级锁,使用较少。

行锁

行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。有可能会出现死锁的情况。 行级锁按照使用方式分为共享锁和排他锁。

InnoDB行锁

在不通过索引条件查询的时候,InnoDB使用的确实是表锁。
由于 MySQL 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行 的记录,但是如果是使用相同的索引键,是会出现锁冲突的。
当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,另外,不论 是使用主键索引、唯一索引或普通索引,InnoDB 都会使用行锁来对数据加锁。
即便在条件中使用了索引字段,但是否使用索引来检索数据是由 MySQL 通过判断不同 执行计划的代价来决定的,如果 MySQL 认为全表扫 效率更高,比如对一些很小的表,它 就不会使用索引,这种情况下 InnoDB 将使用表锁,而不是行锁。因此,在分析锁冲突时, 别忘了检查 SQL 的执行计划(explain查看),以确认是否真正使用了索引。

意向锁

InnoDB 支持多种粒度的锁,也就是行锁和表锁。为了支持多粒度锁定,InnoDB 存储引擎引入了意向锁(Intention Lock)。那什么是意向锁呢?我们在这里可以举一个例子:如果没有意向锁,当已经有人使用行锁对表中的某一行进行修改时,如果另外一个请求要对全表进行修改,那么就需要对所有的行是否被锁定进行扫描,在这种情况下,效率是非常低的;不过,在引入意向锁之后,当有人使用行锁对表中的某一行进行修改之前,会先为表添加意向互斥锁(IX),再为行记录添加互斥锁(X),在这时如果有人尝试对全表进行修改就不需要判断表中的每一行数据是否被加锁了,只需要通过等待意向互斥锁被释放就可以了。意向锁分为两种。

意向共享锁(IS)

事务想要在获得表中某些记录的共享锁,需要在表上先加意向共享锁。

意向互斥锁(IX)

事务想要在获得表中某些记录的互斥锁,需要在表上先加意向互斥锁。

随着意向锁的加入,锁类型之间的兼容矩阵也变得愈加复杂。意向锁其实不会阻塞全表扫描之外的任何请求,它们的主要目的是为了表示是否有人请求锁定表中的某一行数据。

行锁的算法

InnoDB存储引擎有3种行锁的算法。

Record Lock

单个行记录上的锁。Record Lock总是会去锁住索引记录,如果InnoDB存储引擎表在建立的时候没有设置任何一个索引,那么这时InnoDB存储引擎会使用隐式的主键来进行锁定。
​单条索引上加锁,record lock 永远锁的是索引,而非数据本身,如果innodb表中没有索引,那么会自动创建一个隐藏的聚集索引,锁住的就是这个聚集索引。所以说当一条sql没有走任何索引时,那么将会在每一条聚集索引后面加X锁,这个类似于表锁,但原理上和表锁应该是完全不同的。

Gap Lock

间隙锁,锁定一个范围,但不包含记录本身。是在索引的间隙之间加上锁。

Next-Key Lock

Gap Lock + Record Lock,锁定一个范围,并且锁定记录本身。
Next-Key Lock是结合了Gap Lock和Record Lock的一种锁定算法,在Next-Key Lock算法下,InnoDB对于行的查询都是采用这种锁定算法。
除了Next-Key Locking,还有Previous-Key Locking技术。但是不是所有索引都会加上Next-key Lock的,在查询的列是唯一索引(包含主键索引)的情况下,Next-key Lock会降级为Record Lock。

脏读

读未提交。事务A读取了事务B更新的数据,然后事务B回滚了,那么事务A读取的数据是脏数据,因为事务A读取了事务B未提交的数据。

不可重复读

事务A多次读取同一个数据,但是事务B在事务A的读取间隙更新并提交了数据,导致事务A读取结果不一致。

幻读

关于幻读请参考下一篇博客。

MySql锁机制:共享锁、排它锁;行锁、表锁、页锁;相关推荐

  1. mysql的锁机制(读锁,写锁,表锁,行锁,悲观锁,乐观锁,间隙锁)

    读锁和写锁 介绍 MyISAM表锁中的读锁和写锁 读锁(共享锁S): 对同一个数据,多个读操作可以同时进行,互不干扰.加锁的会话只能对此表进行读操作,其他会话也只能进行读操作.MyISAM的读默认是加 ...

  2. 最全MySQL锁讲解:页锁、共享锁、行锁、表锁、悲观锁、乐观锁

    我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致性(数据冲突),如何保证数据并发访问的一致性.有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素,从 ...

  3. MySQL 锁全集(共享锁/排它锁、记录锁/间隙锁/临键锁)

    提升工作效率利器: ‎Mac App Store 上的"Whale - 任务管理.时间.卡片.高效率" 简介:锁是计算机协调多个进程或线程并发访问某一资源变得有序的机制. 一.锁分 ...

  4. mysql 锁机制及实现原理_MySQL-深入浅出锁分类及实现原理

    个人公众号『码农札记』,欢迎关注,查看更多精彩文章. 背景 数据库是一个多用户并发使用的共享资源.当多个并发读写数据时,在数据库中就会产生多个事务同时读写同一数据的情况. 若对并发操作不加控制就可能会 ...

  5. 第二十二节: 以SQLServer为例介绍数据库自有的锁机制(共享锁、更新锁、排它锁等)和事务隔离级别 :

    一. 基本概念 1.共享锁:(holdlock) (1). select的时候会自动加上共享锁,该条语句执行完,共享锁立即释放,与事务是否提交没有关系. (2). 显式通过添加(holdlock)来显 ...

  6. mysql update 排他锁_Mysql 共享锁(lock in share mode),排他锁(for update)

    共享锁(lock in share mode) 简介 允许不同事务之前共享加锁读取,但不允许其它事务修改或者加入排他锁 如果有修改必须等待一个事务提交完成,才可以执行,容易出现死锁 共享锁事务之间的读 ...

  7. mysql删除所有记录命令行_mysql表的清空、删除和修改操作详解

    一.清除mysql表中数据 delete from 表名; truncate table 表名; 不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也 ...

  8. mysql 删除字段_MySQL命令行删除表中的一个字段

    先看看删除之前的表结构: mysql> select * from test; +------+--------+----------------------------------+----- ...

  9. mysql锁机制——乐观锁、悲观锁;共享锁、排他锁、行表锁、间隔后码锁、MVCC 与 thinkphp的lock解析

    锁的引入 如果A有100元,同时对B.C转账,若处理是同时的,则此时同时读取A的余额为100元,在对两人转账后写回,A的余额不是0元而是50元.因此,为了防止这种现象的出现,要引入锁的概念,如只有在A ...

  10. mysql innodb 排他锁_MySQL 针对 InnoDB 引擎锁的种类:行锁(共享锁和排他锁)和表锁(意向共享锁和意向排他锁)...

    InnoDB 锁快速到底 行锁:共享锁(S).排他锁(X) 表锁:意向共享锁(IS).意向排他锁(IX) 下面主要针对 MySQL 中行级锁中的共享锁(S)与排他锁(X)进行分析 共享锁又称为读锁,简 ...

最新文章

  1. Html_div圆角
  2. 处理 react_【学习教程】React 中阻止事件冒泡的问题
  3. Python 代码规范
  4. centos mysql 设置_CentOS下MySql优化及安全设置centos
  5. 接上一篇Ansible和celery的结合,在celery的tasks.py文件里为了实现并发不阻塞的需求,用到了多进程
  6. 用动态数组模拟双向循环链表
  7. 解决MySQL数据库作古掉以及谢绝任事的办法
  8. 不止代码:机器分配(动态规划)
  9. 张大奕网店关联公司被行政处罚:因以不合格产品冒充合格产品
  10. Oracle 日期时间函数大全
  11. http,tcp的长连接和短连接
  12. 想要导航首页提示页_如何设计电商首页运营后台
  13. 用python简单处理图片(3):添加水印
  14. ICON 文件构成 及 制作工具
  15. 国家职业资格:计算机网络管理员
  16. C++内存管理机制—Primitives笔记
  17. mysql 导入导出 csv_学习 MySQL中导入 导出CSV
  18. 从“蛙步”到“雁行”vivo的新周期与新常态
  19. python opencv 常用增强 dct变换+侵蚀+扩张+索贝尔算子+直方图均衡化+光照平衡+
  20. 计算机控制6路模拟量输出,工业级开关量远程无线收发模块|无线开关量6路输入6路输出控制器|4-20ma模拟量无线通信模块...

热门文章

  1. 帝国cms模板-免费帝国CMS模板-帝国CMS模板安装详细教程
  2. python中fontsize_python size
  3. chm 打不开 解决办法
  4. MySQL---行转列
  5. mac 协议的 类型
  6. AAAI2021论文列表(中英对照)
  7. 福昕pdf编辑器 android,福昕PDF编辑器手机版
  8. Windows下利用Python自动切换IP/DNS
  9. JS对象定义和基本方法
  10. 湿空气性质计算,随笔与学习记录(2.水蒸气分压,含湿量,相对湿度)