MySQL update For_MySQL中select中的for update 的用法
注意: FOR UPDATE 只能用在事务区块(BEGIN/COMMIT)中才有效。
有时候我们会看到一些select语句后面紧跟一句for update,表示手动加锁的意思,这里我们就介绍一下对for update的理解。相对另一种手动加锁方法lock in share mode 的区别见:https://blog.csdn.net/liangzhonglin/article/details/65438777。
for update:IX锁(意向排它锁),即在符合条件的rows上都加了排它锁,其他session也就无法在这些记录上添加任何的S锁或X锁。如果不存在一致性非锁定读的话,那么其他session是无法读取和修改这些记录的,但是innodb有非锁定读(快照读并不需要加锁),for update之后并不会阻塞其他session的快照读取操作,除了select …lock in share mode和select … for update这种显示加锁的查询操作。
lock in share mode:是IS锁(意向共享锁),即在符合条件的rows上都加了共享锁,这样的话,其他session可以读取这些记录,也可以继续添加IS锁,但是无法修改这些记录直到你这个加锁的session执行完成(否则直接锁等待超时)。
for update是一个意向排它锁,也就是说对于select … for update 这条语句所在的事务中可以进行任何操作(锁定的是记录,这里指主键id=1的这条记录),但其它事务中只能读取(对这条id=1的记录),不能进行update更新操作。
一般用在并发场景下,如双11的时候商品数量的更新,如果不添加for update的话,则会出现商品数量被多减的bug。
为了更加方便理解,我们举例说明(事务隔离级别为 RR,这里表tb的id为主键)
事务A:
start transaction;
select * from tb where id=1 for update;
update tb set product_num=product_num-1 where id=1;
此时另一个事务B执行同样的程序语句:
start transaction;
// 下面此时会被阻塞,直到事务A提交或者回滚
select * from tb where id=1 for update;
update tb set product_num=product_num-1 where id=1;
对于其它主键值非1的不存在这种情况,只要两个事务操作的不是同一条记录就可以执行成功。
MySQL update For_MySQL中select中的for update 的用法相关推荐
- 转-LR中select next row和update value on的设置
LR中select next row和update value on的设置 LR的参数的取值,和select next row和update value on的设置都有密不可分的关系.下表给出了sel ...
- 【转】MySQL中select * for update锁表的问题
MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...
- mysql begin end 用法_数据库:Mysql中“select ... for update”排他锁分析
作者:志波同学来源:https://mp.weixin.qq.com/s/8uH-7TD9ZRG4NCya80mOHg Mysql InnoDB 排他锁 用法:select - for update; ...
- mysql update 排他锁_数据库:Mysql中“select ... for update”排他锁分析
Mysql InnoDB 排他锁 用法: select - for update; 例如:select * from goods where id = 1 for update; 排他锁的申请前提:没 ...
- 数据库:Mysql中“select ... for update”排他锁分析
Mysql InnoDB 排他锁 用法: select - for update; 例如:select * from goods where id = 1 for update; 排他锁的申请前提:没 ...
- MySQL update For_mysql SELECT FOR UPDATE语句使用示例
以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE READ,在SELECT 的读取锁定主要分为两种方式: SELECT ... L ...
- 数据库中Select For update语句的解析
----------- Oracle -----------------– Oracle 的for update行锁 键字: oracle 的for update行锁 SELECT-FOR UPDAT ...
- MySQL中SELECT语句简单使用
MySQL中SELECT语句简单使用 最近开始复习mysql,查漏补缺吧. 关于mysql 1.MySQL不区分大小写,但是在MySQL 4.1及之前的版本中,数据库名.表名.列名这些标识符默认是区分 ...
- mysql的where字句调优_mysql中select和where子句优化的总结
本篇文章给大家带来的内容是关于mysql中select和where子句优化的总结,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 数据库优化: 1.可以在单个SQL语句,整个应用程序, ...
最新文章
- 2021年大数据Spark(四):三种常见的运行模式
- python 数据类笔试题_一道 Python 类的笔试题详解
- java免费低代码开发平台,steedos-platform
- Google Deepmind大神David Silver带你认识强化学习
- SpringBoot整合MongoDB(实现一个简单缓存)
- 方便食品直接上菜 自嗨锅和西贝哪来的勇气?
- C/C++基础知识点(一)
- Angular jasmine单元测试框架里spyOn的创建原理
- 分数的表示以及计算(c++)
- docker 代理_利用Docker容器实现代理转发和数据备份
- 批量删除Cookie(实用)
- reids学习笔记汇总
- SOEM主站开发笔记-- 点亮第一个LED----SOEM 的simpletest.c代码的解析以及改动
- 【不读唐诗,不足以知盛世】盛唐诗坛的璀璨明星们
- 安卓设备java代码编辑器_15款android设备上的代码编辑器,超级方便!-Go语言中文社区...
- 人人商城 / 数据库
- Android简历模板
- 你创业为什么会失败?
- 面部识别预处理全家桶:mtcnn人脸捕捉、人脸点对齐、仿射运算
- 系统架构中概念总结二