注意: 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. 使用Spring框架实现远程服务暴露与调用
  2. Tableau如何连接其他电脑上的mysql数据库
  3. 面试 | MySQL InnoDB一棵B+树可以存放多少行数据?
  4. SQL Server 中如何判断表是否存在
  5. 造轮子是什么意思_程序员发文质疑阿里天启为kpi项目,重复造轮子,阿里回应:诽谤...
  6. UVC (USB Video Class) 使用笔记 (转)
  7. pyqt5 实现右键自定义_《快速掌握PyQt5》第十七章 事件处理
  8. C++ class实现顺序队列(完整代码)
  9. Python应用实战-Python提升运行速度技巧总结
  10. 北大青鸟c语言课后答案,北大青鸟C语言教程--第一章 C语言基础.ppt
  11. [转]由于项目原因看了一下vml,写了一个Web工作流的设计器雏形!
  12. python opencv中的imwrite函数_python – OpenCV imwrite函数导致’undefined symbol’
  13. C# string.Format json格式字符串报错”输入字符串的格式不正确“
  14. JavaSE进阶582-589 IO流(二)File类/目录拷贝
  15. html大作业网页代码 web网页设计实例作业 ——二手书店-大学生书店(13页) 学生个人网站作业模板 简单个人网页制作
  16. 山东省第七届ACM大赛E题题解
  17. html发短信模版,短信模板管理.html
  18. 如何为BLE 设备添加OTA DFU 空中升级服务(下)?
  19. MyCat相关知识及测试要点
  20. 引用 JAVA面试题集

热门文章

  1. linux命令zxvf
  2. OpenCV 4.x API 详解与C++实例-Mat数据类型详解
  3. 算法基础--优惠券问题(贪心算法)
  4. matlab中 点到线的距离,用matlab求解点到直线的距离
  5. c1TrueDBGrid 常用属性
  6. 一站式清理垃圾——MacBooster 7 Pro Mac可以做到!
  7. 忍者必须死3手游怎么玩?分享一下我玩忍者必须死3的实用心得
  8. php getenv无法获取环境变量
  9. python hook dll_Python——dll注入
  10. JPA 中使用 @OneToMany 、@ManyToOne 等关系映射注解