SELECT ... FOR UPDATE_手动加行级排他锁_行级写锁_行级独占锁

文章目录

  • 介绍
  • 加锁情况分析
    • 明确指定主键,并且数据真实存在,锁定行
    • 明确指定主键,但数据不存在,不加锁
    • 主键不明确,锁定整个表
    • 无主键,锁定整个表
  • 应用场景

介绍

1.FOR UPDATE 加的锁是一种行级排他锁,也是一种悲观锁
2.加锁的事务可以查询也可以修改被加锁的数据行,其它事务只能查询但不能修改被加锁的数据行,而且其它事务不能再往这个数据行加任何类型的锁
3.FOR UPDATE 给行加锁,必须在事务控制模块中才能生效
4.FOR UPDATE 仅适用于 InnoDB
5.MyISAM 只支持表级锁,InnoDB 支持表级锁和行级锁

注:不显式执行 START TRANSACTION,执行 DML 语句也是一个事务,默认自动提交。

什么时候释放锁:

1.执行提交或回滚语句
2.退出数据库
3.程序停止运行

加锁情况分析

查询 InnoDB 表数据时,只有查询条件中明确指定主键值,MySQL 才会锁定行;否则 MySQL 将会锁定整个表。

假设有下面这张表及数据:

mysql> select * from user;
+----------------------+----------+
| id                   | NAME     |
+----------------------+----------+
| 00000000000000000001 | zhangsan |
| 00000000000000000002 | lisi     |
| 00000000000000000003 | libai    |
+----------------------+----------+
3 rows in set (0.00 sec)

注:ID 是主键。

明确指定主键,并且数据真实存在,锁定行

START TRANSACTION; -- 开始事务
SELECT * FROM user WHERE id=00000000000000000003 FOR UPDATE;
SELECT * FROM user WHERE id=00000000000000000003 and name='lisi' FOR UPDATE;

明确指定主键,但数据不存在,不加锁

SELECT * FROM user WHERE id=0 FOR UPDATE;

主键不明确,锁定整个表

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

注意:不管是否查询到记录,都会锁定表。

无主键,锁定整个表

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

应用场景

比如火车票订票,在手机屏幕上显示有票,如果没有锁定相关数据,在真正进行出票(扣减锁票)时,你必须重新确定一下这个数据有没有被其他客户端修改过。如果你使用了行级锁,则可以直接出票,所以这个业务场景可以使用 FOR UPDATE 对数据进行加锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

广义表

广义表(广义表也称为列表&#xff0c;是线性表的一种推广&#xff0c;也是数据元素的有序序列) 一、基础 1.如何设定链表结点?广义表中的数据元素可能为单元素(原子)或子表&#xff0c;由此需要两种结点:一种是表结点&#xff0c;用以表示广义表;一种是单元素结点&#xff0c;…

数据库各种锁详解

文章目录排他锁共享锁更新锁意向锁锁的粒度数据库自动加锁手动加锁各种锁之间的兼容问题排他锁 Exclusive Locks&#xff0c;英译&#xff1a;排他锁&#xff0c;简称 X 锁&#xff0c;又称为写锁或独占锁。排他锁分为表级排他锁和行级排他锁。 如果事务 T1 对数据行对象 A 加…

activiti dmn_新的DMN编辑器预览

activiti dmnWorkbench 7.13.0.Final于10月16日星期二发布&#xff0c;此版本带来了许多有趣的功能和重要的修复程序。 亮点之一是作为技术预览功能的新DMN编辑器&#xff0c;该功能仍在开发中&#xff0c;但您可以开始使用。 在本文中&#xff0c;您将学习如何启用DMN编辑器预…

MySQL的索引存储数据结构BTree和B+Tree的区别

文章目录BTree 原理示意图BTree 原理示意图BTree的树层级很少BTree 可以高效支持范围查找BTree 原理示意图 注&#xff1a;BTree 就是 B-Tree&#xff0c;实际上官方并没有 B-Tree 的说法。 BTree 原理示意图 BTree的树层级很少 BTree 的数据存在每个节点中&#xff0c;所以每…

jdk11 javafx_JDK 11上的JavaFX

jdk11 javafx在JFX第11版发布后&#xff0c;人们对JavaFX与JDK的解耦感到百感交集。 我们许多人认为现在是时候告别JavaFX并改用另一种GUI技术了&#xff0c;而另一些人对此情况感到高兴。 他们认为&#xff0c;将JavaFX与Oracle分离开来&#xff0c;并致力于将其作为开源社区驱…

配置Java环境变量

JAVA环境变量配置 一、新建系统变量 新建变量&#xff0c;找到安装目录新建一个JAVA_HOME,路径为bin目录的前一级目录。 可以安装多个JAVA版本&#xff0c;然后新建不同的JAVA_HOME名称&#xff0c;然后填写bin目录的前一级路径。 二、编辑环境变量 找到path,然后编辑%JAVA…

MySQL的存储引擎InnoDB,B+Tree数据结构索引的实现原理图(聚簇索引/聚集索引)

1.表数据文件本身就是按BTree组织的一个索引结构文件 2.InnoDB的BTree的索引数据结构中&#xff0c;表数据和索引数据合并在一起&#xff0c;即叶子节点包含了完整的数据记录&#xff0c;这样的索引叫聚簇索引。

idea 切换java11_Java 11就在这里,您准备好进行切换了吗?

idea 切换java11在应该将Java 9发行版“震撼我们的世界”一年之后&#xff0c;我们一直在等待的LTS版本终于出现了 我们知道&#xff0c;大多数开发人员&#xff0c;团队&#xff0c;公司等尚未通过Java 8进行更新。 即使去年发布了模块Java 9&#xff0c;随后在3月又发布了Ja…

编译Java源文件

编写 新建hello.java文件 注意类名要和文件名称相同&#xff0c;如果不相同会提示错误 public class hello{public static void main(String[] args) {System.out.println("HelloWorld");} }编译 javac hello.java 编译会生成相应的.class文件。 运行 java hell…

oracle jdk_两个Oracle JDK的故事

oracle jdk最近 &#xff0c;人们担心 Java开发人员现在会无意中使用错误的Oracle提供的JDK实现&#xff08;从JDK 11开始 &#xff09;&#xff0c; Oracle提供了开源OpenJDK的构建 &#xff0c;并且还主要基于OpenJDK源提供了商业JDK的构建。 下表比较并对比了Oracle提供的两…

安装MAVEN和找不到JAVA_HOME问题原因

一、MAVEN安装 1.将下载好的MAVEN解压 2.配置MAVEN环境变量 MAVEN_HOME3.3.9 配置path 3.配置本地仓库 打开settings.xml进行修改 在MAVEN下新建一个repository文件夹 4.配置阿里MAVEN仓库配置 每次去阿里云下载jar包 <mirror><id>AliMaven</id>&…

数据库中的二级索引_普通索引_辅助索引

普通索引、二级索引、辅助索引是同个东西。 假设有张表的字段为 name&#xff0c;这个字段添加普通索引&#xff08;也叫二级索引&#xff09;&#xff0c;其存储引擎为 InnoDB&#xff0c;那么这个 name 索引的结构图&#xff1a;

2018-12 jdk_JDK 12新闻(2018年9月13日)

2018-12 jdk由于计划于本月晚些时候&#xff08;2018年9月25日&#xff09;发布JDK 11的 一般可用性 &#xff0c;是时候开始更仔细地研究JDK 12了 。 在OpenJDK jdk-dev邮件列表上的标题为“ JDK 12的计划时间表 ”的消息中 &#xff0c; 马克赖因霍尔德 &#xff08; Mark R…

idea连接mysql数据库时连接显示错误caching_sha2_password

问题描述 Connection to paradigmlocalhost failed. Unable to load authentication plugin caching_sha2_password.问题原因 mysql8之前的版本使用的密码加密规则是mysql_native_password&#xff0c;但是在mysql8则是caching_sha2_password&#xff0c;所以需要修改密码加密…

MySQL联合索引原理_复合索引_组合索引_多列索引

文章目录联合索引原理示意图联合索引就是复合索引、组合索引、多列索引。联合索引原理示意图

fluent design_Fluent Design单选按钮,复选框,选择框,Java菜单

fluent design这次我对JMetro进行了重大更新。 3.8版带来了以下新的Fluent Design &#xff08;FDS&#xff09;启发风格&#xff08;深色和浅色&#xff09;和更新&#xff1a; 新的单选按钮样式&#xff1b; 复选框的新样式&#xff1b; 菜单的新样式&#xff1b; 更新了…

MySQL的explain工具介绍

文章目录介绍explain extendedshow waringsexplain partitionsid 字段select_typetypekeypossible_keyskey_lenkey_len 计算规则refrowsextra介绍 使用 explain 可以模拟优化器执行 SQL 语句&#xff0c;会返回 SQL 语句的执行计划信息&#xff0c;但是不会真正去执行这条 SQL…

jetty设置双向ssl_在Jetty中设置SSL

jetty设置双向ssl当您必须快速启用SSL并陷入困境时&#xff0c;您是否遇到了问题&#xff1a;-( 你并不孤单&#xff0c;我将分享我的痛苦和一些学习。 我将分享在码头上启用SSL的步骤。 警告&#xff1a;仅将以下说明用于开发人员设置和生产&#xff0c;请联系您的安全专家…

使用Thumbnailator压缩照片

导入依赖 <dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.8</version></dependency>代码 package com.asx.hyd.non.trs;import net.coobird.thumbnailator.Thumbnails;impo…

MySQL的索引优化

文章目录全值匹配最左前缀原则不在索引列上使用函数&#xff0c;会导致索引失效而转向使用全表扫描范围条件右边的索引列会失效尽量使用覆盖索引使用不等于操作符无法使用索引is null&#xff0c;is not null 一般情况下也无法使用索引like 以通配符开头的&#xff0c;索引会失…