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

共享锁(Share Lock)
共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。

如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。

用法

SELECT … LOCK IN SHARE MODE;

在查询语句后面增加LOCK IN SHARE MODE,MySQL 就会对查询结果中的每行都加共享锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁,否则会被阻塞。其他线程也可以读取使用了共享锁的表,而且这些线程读取的是同一个版本的数据。

使用场景
  SELECT … LOCK IN SHARE MODE走的是IS锁(意向共享锁),即在符合条件的rows上都加了共享锁,这样的话,其他人可以读取这些记录,也可以继续添加IS锁,但是无法修改这些记录直到你这个加锁的过程执行完成(完成的情况有:事务的提交,事务的回滚,否则直接锁等待超时)。
  SELECT … LOCK IN SHARE MODE的应用场景适合于两张表存在关系时的写操作,拿mysql官方文档的例子来说,一个表是child表,一个是parent表,假设child表的某一列child_id映射到parent表的c_child_id列,那么从业务角度讲,此时我直接insert一条child_id=100记录到child表是存在风险的,因为刚insert的时候可能在parent表里删除了这条c_child_id=100的记录,那么业务数据就存在不一致的风险。正确的方法是再插入时执行select * from parent where c_child_id=100 lock in share mode,锁定了parent表的这条记录,然后执行insert into child(child_id) values (100)就不会存在这种问题了。

排他锁(Exclusive Lock)
排他锁又称写锁、独占锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。

用法

SELECT … FOR UPDATE;

在查询语句后面增加FOR UPDATE,MySQL 就会对查询结果中的每行都加排他锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请排他锁,否则会被阻塞。

使用场景:

订单的商品数量
    如果是同一张表的应用场景,举个例子,电商系统中计算一种商品的剩余数量,在产生订单之前需要确认商品数量>=1,产生订单之后应该将商品数量减1。
    1 select amount from product where product_name=‘XX’;
    2 update product set amount=amount-1 where product_name=‘XX’;

显然1的做法是是有问题的,因为如果1查询出amount为1,但是这时正好其他session也买了该商品并产生了订单,那么amount就变成了0,那么这时第二步再执行就有问题。那么采用lock in share mode可行吗,也是不合理的,因为两个session同时锁定该行记录时,这时两个session再update时必然会产生死锁导致事务回滚。以下是操作范例(按时间顺序)。
     
    通过对比,lock in share mode适用于两张表存在业务关系时的一致性要求,for update适用于操作同一张表时的一致性要求

MySQL数据库的共享锁和排他锁相关推荐

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

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

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

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

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

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

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

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

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

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

  6. Mysql中的共享锁和排他锁

    一.前言   刚开始学习MySQL中锁的时候,网上一查出来一堆,什么表锁.行锁.读锁.写锁.悲观锁.乐观锁等等等,直接整个人就懵了.好多文章都尽量把很多锁给列举一遍,生怕写少了内容不够丰富,有的连死锁 ...

  7. MySQL 在高并发下的 订单撮合 系统使用 共享锁 与 排他锁 保证数据一致性

    原文:MySQL 在高并发下的 订单撮合 系统使用 共享锁 与 排他锁 保证数据一致性 作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe1 ...

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

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

  9. Mysql共享锁实例_mysql共享锁与排他锁用法实例分析

    本文实例讲述了mysql共享锁与排他锁用法.分享给大家供大家参考,具体如下: mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流. 共享锁又称 ...

最新文章

  1. matlab 12脉波变压器,12脉波中频炉专用变压器外形尺寸
  2. Pytest前后置处理
  3. javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
  4. mysql主从配置访问_Mysql主从配置,实现读写分离
  5. [转载]手工安全测试方法修改建议
  6. ubuntu下好用的TCP/UDP调试工具
  7. DH算法证明及相应的理论知识
  8. Python-pandas-Excel排序、筛选
  9. 澳鹏Appen收购Quadrant:移动定位数据业务进一步增强
  10. uniapp 微信小程序修改BarTitle
  11. python 3d绘图模块_Python绘制3D图形
  12. [玩转编程] C语言+模拟器制作简单脚本
  13. Word文档 替换功能
  14. 干货满满 | 不容错过的数据科学入门数学指南
  15. scratch(图形化编程工具)使用画笔绘制雪绒花!真的太美了!
  16. Div与Span标签详解
  17. 学生用计算机app,学生党利器!微软出品的这个小众APP,帮你搞定数学难题!
  18. Python新建、写入和修改txt(文本文档)
  19. 开源C#2.0体温单程序
  20. 杰理之配置工具说明【篇】

热门文章

  1. RTL8198D 编译出现sk_pacing_shift_update未定义
  2. 简单的本地图片服务器的搭建
  3. 312戳气球——力扣算法系列2020.07.19 Python
  4. zipline中TradingCalendar源码分析
  5. FPGA多进制数字相位调制( MPSK)
  6. 一名讲师讲述计算机专业的职业方向
  7. 修改个人博客halo系统从gradle为maven全程记录步骤和问题总结
  8. vulnstack红日-三
  9. odoo用户使用——制造
  10. 欢迎大家和我一起从零开始学习机器学习,和你一样的初学者的学习周刊,不再担心学不懂机器学习,最简单最适合新手的博客开始了!