注意: 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 的用法相关推荐

  1. 转-LR中select next row和update value on的设置

    LR中select next row和update value on的设置 LR的参数的取值,和select next row和update value on的设置都有密不可分的关系.下表给出了sel ...

  2. 【转】MySQL中select * for update锁表的问题

    MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...

  3. mysql begin end 用法_数据库:Mysql中“select ... for update”排他锁分析

    作者:志波同学来源:https://mp.weixin.qq.com/s/8uH-7TD9ZRG4NCya80mOHg Mysql InnoDB 排他锁 用法:select - for update; ...

  4. mysql update 排他锁_数据库:Mysql中“select ... for update”排他锁分析

    Mysql InnoDB 排他锁 用法: select - for update; 例如:select * from goods where id = 1 for update; 排他锁的申请前提:没 ...

  5. 数据库:Mysql中“select ... for update”排他锁分析

    Mysql InnoDB 排他锁 用法: select - for update; 例如:select * from goods where id = 1 for update; 排他锁的申请前提:没 ...

  6. MySQL update For_mysql SELECT FOR UPDATE语句使用示例

    以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE READ,在SELECT 的读取锁定主要分为两种方式: SELECT ... L ...

  7. 数据库中Select For update语句的解析

    ----------- Oracle -----------------– Oracle 的for update行锁 键字: oracle 的for update行锁 SELECT-FOR UPDAT ...

  8. MySQL中SELECT语句简单使用

    MySQL中SELECT语句简单使用 最近开始复习mysql,查漏补缺吧. 关于mysql 1.MySQL不区分大小写,但是在MySQL 4.1及之前的版本中,数据库名.表名.列名这些标识符默认是区分 ...

  9. mysql的where字句调优_mysql中select和where子句优化的总结

    本篇文章给大家带来的内容是关于mysql中select和where子句优化的总结,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 数据库优化: 1.可以在单个SQL语句,整个应用程序, ...

最新文章

  1. 2021年大数据Spark(四):三种常见的运行模式
  2. python 数据类笔试题_一道 Python 类的笔试题详解
  3. java免费低代码开发平台,steedos-platform
  4. Google Deepmind大神David Silver带你认识强化学习
  5. SpringBoot整合MongoDB(实现一个简单缓存)
  6. 方便食品直接上菜 自嗨锅和西贝哪来的勇气?
  7. C/C++基础知识点(一)
  8. Angular jasmine单元测试框架里spyOn的创建原理
  9. 分数的表示以及计算(c++)
  10. docker 代理_利用Docker容器实现代理转发和数据备份
  11. 批量删除Cookie(实用)
  12. reids学习笔记汇总
  13. SOEM主站开发笔记-- 点亮第一个LED----SOEM 的simpletest.c代码的解析以及改动
  14. 【不读唐诗,不足以知盛世】盛唐诗坛的璀璨明星们
  15. 安卓设备java代码编辑器_15款android设备上的代码编辑器,超级方便!-Go语言中文社区...
  16. 人人商城 / 数据库
  17. Android简历模板
  18. 你创业为什么会失败?
  19. 面部识别预处理全家桶:mtcnn人脸捕捉、人脸点对齐、仿射运算
  20. 系统架构中概念总结二

热门文章

  1. 龙腾出行基于Kubernetes的DevOps流水线实战
  2. 计算机二级几月出成绩,计算机二级考试几月出成绩
  3. Android onStop onDestroy方法延时回调的问题
  4. 2011年通用产品团队Outing-朱家尖之行
  5. idea控制台乱码解决办法
  6. stm32 i2c/IIC读写HP303S气压传感器
  7. 色彩空间类型(精简)
  8. 【闪电侠学netty】第7章 数据载体ByteBuf的介绍
  9. 群晖docker镜像源更换为阿里云镜像源
  10. Uniapp自定义基座说明