MySQL数据库的共享锁和排他锁
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数据库的共享锁和排他锁相关推荐
- mysql 事务排他锁_[数据库事务与锁]详解六: MySQL中的共享锁与排他锁
注明: 本文转载自http://www.hollischuang.com/archives/923 在MySQL中的行级锁,表级锁,页级锁中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大 ...
- MySQL中的共享锁与排他锁
2019独角兽企业重金招聘Python工程师标准>>> 在MySQL中的行级锁,表级锁,页级锁中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突.行 ...
- mysql排他锁和共享锁视频_分享MySQL 中的共享锁和排他锁的用法
在 MySQL 中的行级锁.表级锁和页级锁中,咱们介绍过,行级锁是 MySQL 中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突.行级锁分为共享锁和排他锁两种,本文将详细介绍共享锁和排他锁的概 ...
- 一文搞懂 mysql 中的共享锁、排他锁、悲观锁、乐观锁及使用场景
目录 一.常见锁类型 二.Mysql引擎介绍 三.常用引擎间的区别 四.共享锁与排他锁 五.排他锁的实际应用 六.共享锁的实际应用 七.死锁的发生 八.另一种发生死锁的情景 九.死锁的解决方式 十.意 ...
- mysql 排它锁_Mysql共享锁、排他锁、悲观锁、乐观锁
一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |--排他锁(X锁,MyISAM 叫做写锁) |--间隙锁( ...
- Mysql中的共享锁和排他锁
一.前言 刚开始学习MySQL中锁的时候,网上一查出来一堆,什么表锁.行锁.读锁.写锁.悲观锁.乐观锁等等等,直接整个人就懵了.好多文章都尽量把很多锁给列举一遍,生怕写少了内容不够丰富,有的连死锁 ...
- MySQL 在高并发下的 订单撮合 系统使用 共享锁 与 排他锁 保证数据一致性
原文:MySQL 在高并发下的 订单撮合 系统使用 共享锁 与 排他锁 保证数据一致性 作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe1 ...
- mysql 的独占锁和排它锁_数据库中的共享锁与排他锁
摘要: 能修改数据.为什么要加锁很多人都知道,锁是用来解决并发问题的,那么什么是并发问题呢?并发情况下,不加锁会有什么问题呢?拿生活中的洗手间举例子,每个洗手间都会有一个门,并且是可以上锁的,当我们进 ...
- Mysql共享锁实例_mysql共享锁与排他锁用法实例分析
本文实例讲述了mysql共享锁与排他锁用法.分享给大家供大家参考,具体如下: mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流. 共享锁又称 ...
最新文章
- matlab 12脉波变压器,12脉波中频炉专用变压器外形尺寸
- Pytest前后置处理
- javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
- mysql主从配置访问_Mysql主从配置,实现读写分离
- [转载]手工安全测试方法修改建议
- ubuntu下好用的TCP/UDP调试工具
- DH算法证明及相应的理论知识
- Python-pandas-Excel排序、筛选
- 澳鹏Appen收购Quadrant:移动定位数据业务进一步增强
- uniapp 微信小程序修改BarTitle
- python 3d绘图模块_Python绘制3D图形
- [玩转编程] C语言+模拟器制作简单脚本
- Word文档 替换功能
- 干货满满 | 不容错过的数据科学入门数学指南
- scratch(图形化编程工具)使用画笔绘制雪绒花!真的太美了!
- Div与Span标签详解
- 学生用计算机app,学生党利器!微软出品的这个小众APP,帮你搞定数学难题!
- Python新建、写入和修改txt(文本文档)
- 开源C#2.0体温单程序
- 杰理之配置工具说明【篇】
热门文章
- RTL8198D 编译出现sk_pacing_shift_update未定义
- 简单的本地图片服务器的搭建
- 312戳气球——力扣算法系列2020.07.19 Python
- zipline中TradingCalendar源码分析
- FPGA多进制数字相位调制( MPSK)
- 一名讲师讲述计算机专业的职业方向
- 修改个人博客halo系统从gradle为maven全程记录步骤和问题总结
- vulnstack红日-三
- odoo用户使用——制造
- 欢迎大家和我一起从零开始学习机器学习,和你一样的初学者的学习周刊,不再担心学不懂机器学习,最简单最适合新手的博客开始了!