for update 的作用是在查询的时候为行加上排它锁,当一个事务的操作未完成时候,其他事务可以读取但是不能写入或更新。
它的典型使用场景是高并发并且对于数据的准确性有很高要求,比如金钱、库存等,一般这种操作都是很长一串并且开启事务的,假如现在要对库存进行操作,在刚开始读的时候是1,然后马上另外一个进程将库存更新为0了,但事务还没结束,会一直用1进行后续的逻辑,就会有问题,所以需要用for upate 加锁防止出错,记住一个原则:一锁二判三更新

InnoDB行锁类型

共享锁(S-Lock)

允许多个事务对于同一数据可以共享一把锁,都能访问到数据,
阻止其它事务对于同一数据获取排它锁

排它锁(X-Lock)

允许事务删除或者更新一行数据,
阻止其它事务对于同一数据获取其它锁,包括共享锁排它锁

select 语句默认不获取任何锁,所以是可以读被其它事务持有排它锁的数据的!

for update 使用方式

for update 仅适用于InnoDB,并且必须开启事务,在begincommit之间才生效。

select * from table_name where ... for update;

行级锁?表级锁?

InnoDB 默认是行级锁,当有明确指定的主键/索引时候,是行级锁,否则是表级锁
假设表 user,存在有idname字段,id是主键,有5条数据。

行级锁

明确指定主键,并且有此记录,行级锁

SELECT * FROM user WHERE id = 1 FOR UPDATE;
SELECT * FROM user WHERE id = 1 and name = 'segon' FOR UPDATE;

验证

进程 1 进程 2
begin;
SELECT * FROM user WHERE id = 1 FOR UPDATE;
UPDATE user SET name = ‘test’ WHERE id = 2; – 成功
UPDATE user SET name = ‘test’ WHERE id = 1; – 等待
commit;
执行等待的任务,成功

表级锁

无主键/索引,表级锁

SELECT * FROM user WHERE name = 'segon' FOR UPDATE;

主键/索引不明确,表级锁

SELECT * FROM user WHERE id <> 3 FOR UPDATE;
SELECT * FROM user WHERE id LIKE '3' FOR UPDATE;

验证

进程 1 进程 2
begin;
SELECT * FROM user WHERE id LIKE ‘3’ FOR UPDATE;
UPDATE user SET name = ‘test’ WHERE id = 1; – 等待
commit;
执行等待的任务,成功

无锁

明确指定主键/索引,若查无此记录,无锁

SELECT * FROM user WHERE id = -1 FOR UPDATE;

验证

进程 1 进程 2
begin;
SELECT * FROM user WHERE id = -1 FOR UPDATE;
UPDATE user SET name = ‘test’ WHERE id = 2; – 成功
commit;

for update相关推荐

  1. 使用JPA进行Update操作 @Query注解的用法,JPL

    使用jpa进行update操作有两种,第一种就是先查询,set,再进行save更新.这种做法过于繁杂,我只是要进行一个更新操作却变成了三步,所以我推荐使用第二种: @Modifying @Query( ...

  2. 使用JPA进行update操作时,报org.springframework.beans.factory.BeanCreationException: Error creating bean with

    使用JPA进行update操作时,报org.springframework.beans.factory.BeanCreationException: Error creating bean with ...

  3. SVN用法大全,SVN除了update、commit还有什么

    svn除了大家都知道的update.commit以外还有什么常用功能呢? 点击TortoiseSVN后,出现了右图的列表,这其中有哪些是常用的功能呢?最近在家办公,有些东西要svn操作,就了解了下. ...

  4. MySql数据库Update批量更新与批量更新多条记录的不同值实现方法

    批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other ...

  5. Microsoft Store无法下载应用 Windows update服务无法启用,错误5:拒绝访问 的解决方法。

    Microsoft Store无法下载应用,点了安装没反应,查看服务里windows update开启了没有.只有这项服务开启才能在微软商店里安装应用. (ps:安装xbox需要把设置里地区改为香港特 ...

  6. ElasticSearch(六) Update API

    一.修改部分字段By  UpdateRequest UpdateRequest updateRequest = new UpdateRequest(); updateRequest.index(&qu ...

  7. Ubuntu apt-get install、apt-get -f install、apt-get --purge remove、apt-get update、apt-get upgrade、

    1. 常用命令列表 命令 描述 apt-cache search package 搜索软件包 apt-cache show package 获取包的相关信息,如说明.大小.版本等 sudo apt-g ...

  8. update 改写 merge into

    update语句改写成merge into有时会提高运行速度 看两个案例 1.根据业务将两个嵌套子查询改写成max,速度有3min提升到3s UPDATE OPER_792.LL_SCB_YDKB_2 ...

  9. Oracle 触发器 Update 不能操作本表的疑问

    今天要解决一个需求,类似表A有个字段叫flag存储的是0 or  1 ,当一行记录更改为1的时候,其他行同字段要变为0. 这样的需求第一个思路想尝试下能否用触发器来实现 create or repla ...

  10. Oracle 10.2.0.5.4 Patch Set Update (PSU) – Patch No: p12419392

    有关Oracle patch和PSU,PSR 说明参考我的blog: Oracle 补丁体系 及opatch 工具 介绍 http://blog.csdn.net/tianlesoftware/art ...

最新文章

  1. Python3中的类和实例
  2. 纠结的Python2.7编码与os.walk()函数的目录参数
  3. Oracle之物化视图
  4. flutter打开android界面,在已有Android项目中使用Flutter
  5. 《研磨设计模式》chap24 桥接模式bridge(1)基本概念
  6. PyCharm调试错误
  7. Unity的Animator中Transition有延迟的问题
  8. 154 万 AI 开发者用数据告诉你,中国 AI 如何才能弯道超车?| 中国 AI 应用开发者报告
  9. 我的WCF之旅(1):创建一个简单的WCF程序(转载)
  10. java new 关键字到底做了什么?
  11. 网络安全界基于知识的识别和映射提出网络空间资源分类明细
  12. 白鹭引擎 android9,【安卓】手把手教你Egret引擎一键发布华为快游戏
  13. javascript 字符串的排列与组合
  14. 【Vue实用功能】Vue实现tab页多页面切换
  15. excel不显示提示对话框
  16. 平衡树(splay)学习笔记(详细,从入门到精(bao)通(ling))(持续更新)
  17. DVWA——暴力破解
  18. openpnp - configure - Connect the driver to your controller
  19. php查询更新数据库数据类型,更新Update
  20. 荣誉系统排名是整个服务器,《魔兽世界怀旧服》荣誉系统怎么样 荣誉系统奖励大全...

热门文章

  1. Object.assign()的详解和用法
  2. 使用jQuery完成下拉菜单
  3. python里使用协程和StreamReader、StreamWriter来创建echo服务端
  4. 抖音电商副总裁木青:抖音电商正在成为服饰行业的增量风口
  5. mysql association_在mybatis的xml中添加association不生效
  6. 【数据压缩】C语言实现bmp图片序列生成yuv视频
  7. 《计算机组成原理》— 计算机组成原理(一)
  8. 【Java】Java安装与配置指南
  9. Python基于人脸识别的考勤系统(附源码)
  10. 使用GPG验证文件签名