for update
for update
的作用是在查询的时候为行加上排它锁
,当一个事务的操作未完成时候,其他事务可以读取但是不能写入或更新。
它的典型使用场景是高并发并且对于数据的准确性有很高要求,比如金钱、库存等,一般这种操作都是很长一串并且开启事务的,假如现在要对库存进行操作,在刚开始读的时候是1,然后马上另外一个进程将库存更新为0了,但事务还没结束,会一直用1进行后续的逻辑,就会有问题,所以需要用for upate
加锁防止出错,记住一个原则:一锁二判三更新
。
InnoDB行锁类型
共享锁(S-Lock)
允许多个事务对于同一数据可以共享一把锁,都能访问到数据,
阻止其它事务对于同一数据获取排它锁
。
排它锁(X-Lock)
允许事务删除或者更新一行数据,
阻止其它事务对于同一数据获取其它锁,包括共享锁
和排它锁
。
select
语句默认不获取任何锁,所以是可以读被其它事务持有排它锁
的数据的!
for update 使用方式
for update
仅适用于InnoDB
,并且必须开启事务,在begin
与commit
之间才生效。
select * from table_name where ... for update; |
行级锁?表级锁?
InnoDB 默认是行级锁,当有明确指定的主键/索引
时候,是行级锁
,否则是表级锁
。
假设表 user
,存在有id
跟name
字段,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相关推荐
- 使用JPA进行Update操作 @Query注解的用法,JPL
使用jpa进行update操作有两种,第一种就是先查询,set,再进行save更新.这种做法过于繁杂,我只是要进行一个更新操作却变成了三步,所以我推荐使用第二种: @Modifying @Query( ...
- 使用JPA进行update操作时,报org.springframework.beans.factory.BeanCreationException: Error creating bean with
使用JPA进行update操作时,报org.springframework.beans.factory.BeanCreationException: Error creating bean with ...
- SVN用法大全,SVN除了update、commit还有什么
svn除了大家都知道的update.commit以外还有什么常用功能呢? 点击TortoiseSVN后,出现了右图的列表,这其中有哪些是常用的功能呢?最近在家办公,有些东西要svn操作,就了解了下. ...
- MySql数据库Update批量更新与批量更新多条记录的不同值实现方法
批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other ...
- Microsoft Store无法下载应用 Windows update服务无法启用,错误5:拒绝访问 的解决方法。
Microsoft Store无法下载应用,点了安装没反应,查看服务里windows update开启了没有.只有这项服务开启才能在微软商店里安装应用. (ps:安装xbox需要把设置里地区改为香港特 ...
- ElasticSearch(六) Update API
一.修改部分字段By UpdateRequest UpdateRequest updateRequest = new UpdateRequest(); updateRequest.index(&qu ...
- 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 ...
- update 改写 merge into
update语句改写成merge into有时会提高运行速度 看两个案例 1.根据业务将两个嵌套子查询改写成max,速度有3min提升到3s UPDATE OPER_792.LL_SCB_YDKB_2 ...
- Oracle 触发器 Update 不能操作本表的疑问
今天要解决一个需求,类似表A有个字段叫flag存储的是0 or 1 ,当一行记录更改为1的时候,其他行同字段要变为0. 这样的需求第一个思路想尝试下能否用触发器来实现 create or repla ...
- 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 ...
最新文章
- Python3中的类和实例
- 纠结的Python2.7编码与os.walk()函数的目录参数
- Oracle之物化视图
- flutter打开android界面,在已有Android项目中使用Flutter
- 《研磨设计模式》chap24 桥接模式bridge(1)基本概念
- PyCharm调试错误
- Unity的Animator中Transition有延迟的问题
- 154 万 AI 开发者用数据告诉你,中国 AI 如何才能弯道超车?| 中国 AI 应用开发者报告
- 我的WCF之旅(1):创建一个简单的WCF程序(转载)
- java new 关键字到底做了什么?
- 网络安全界基于知识的识别和映射提出网络空间资源分类明细
- 白鹭引擎 android9,【安卓】手把手教你Egret引擎一键发布华为快游戏
- javascript 字符串的排列与组合
- 【Vue实用功能】Vue实现tab页多页面切换
- excel不显示提示对话框
- 平衡树(splay)学习笔记(详细,从入门到精(bao)通(ling))(持续更新)
- DVWA——暴力破解
- openpnp - configure - Connect the driver to your controller
- php查询更新数据库数据类型,更新Update
- 荣誉系统排名是整个服务器,《魔兽世界怀旧服》荣誉系统怎么样 荣誉系统奖励大全...