Mysql共享锁与排他锁

mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流。

共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。

排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select …for update语句,加共享锁可以使用select … lock in share mode语句。所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select …from…查询数据,因为普通查询没有任何锁机制。

说了这么多,咱们来看下以下简单的例子:

我们有如下测试数据

Mysql共享锁与排他锁

现在我们对id=1的数据行排他查询,这里会使用begin开启事务,而不会看见我关闭事务,这样做是用来测试,因为提交事务或回滚事务就会释放锁。

打开一个查询窗口

Mysql共享锁与排他锁

会查询到一条数据,现在打开另一个查询窗口,对同一数据分别使用排他查和共享锁查询两种方式查询

排他查

Mysql共享锁与排他锁

共享查

Mysql共享锁与排他锁

我们看到开了排他锁查询和共享锁查询都会处于阻塞状态,因为id=1的数据已经被加上了排他锁,此处阻塞是等待排他锁释放。

如果我们直接使用以下查询呢

Mysql共享锁与排他锁

我们看到是可以查询到数据的。

我们再看一下一个事务获取了共享锁,在其他查询中也只能加共享锁或不加锁。

Mysql共享锁与排他锁

Mysql共享锁与排他锁

我们看到是可以查询数据的,但加排他锁就查不到,因为排他锁与共享锁不能存在同一数据上。

最后我们验证下上面说的mysql InnoDb引擎中update,delete,insert语句自动加排他锁的问题,

Mysql共享锁与排他锁

Mysql共享锁与排他锁

此时共享查询处于阻塞,等待排它锁的释放,但是用普通查询能查到数据,因为没用上锁机制不与排他锁互斥,但查到的数据是修改数据之前的老数据。

Mysql共享锁与排他锁

然后我们提交数据,释放排他锁看下修改后的数据,此时可用排他查,共享查和普通查询, 因为事务提交后该行数据释放排他锁,下面就只显示普通查询,其他的同学们自己去验证。

Mysql共享锁与排他锁

Mysql共享锁与排他锁

可以看到结果与预期的一样。

以上为我对mysql中共享锁与排他锁的个人理解,有不正确的地方还希望各位指正。

原文:https://www.cnblogs.com/boblogsbo/p/5602122.html

Original: https://www.cnblogs.com/dong320/p/14621646.html
Author: 轨迹320
Title: Mysql共享锁与排他锁

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/573462/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • IntelliWeb 中嵌入Silverlight/Flash方法

    简介:intelliWeb 是基于构件、Ajax、RichClient技术的J2EE应用快速开发平台。 嵌入Silverlight/Flash方法 很简单,把ActiveX放到e:…

    Java 2023年5月29日
    065
  • 学习MySQL

    新建表: Student(学生表) 列名 类型 大小 默认值 说明 id int 主键(自增长) code varchar 50 ” 学生编号 name varchar…

    Java 2023年6月5日
    093
  • IDEA分析JAVA内存溢出和内存泄漏

    参考资料: 1、JProfiler分析dump文件 https://blog.csdn.net/axin1240101543/article/details/105142141 2…

    Java 2023年5月29日
    0111
  • MyBatis-Plus 笔记

    MyBatis-Plus学习(3.3.1.tmp版本教程) 1、快速开始 1.1、数据库脚本 DROP TABLE IF EXISTS user; CREATE TABLE use…

    Java 2023年6月7日
    086
  • Spring JDBC

    用过JDBC(Java DataBase Connectivity,Java数据库连接)的人都知道,JDBC非常臃肿,一点也不可爱。以致于我们每次使用JDBC操作数据库时,总会忍不…

    Java 2023年6月5日
    080
  • IO流(序列化流和反序列化流)

    序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输。对象 — 流数据(ObjectOutputStream)* 反序列化流:把文本文件中的流对象数据或者网络中…

    Java 2023年6月5日
    070
  • JAVAEE学习路线分享

    今天把我的教学经验分享给大家。适合大多数人的学习路线。注:目前作者已经转行做java培训。 首先是培养兴趣。先开始学习HTML知识。也就是做网页,从这里开始比较简单,就是几个标签单…

    Java 2023年6月9日
    098
  • 【SpringCloud原理】万字剖析OpenFeign之FeignClient动态代理生成源码

    前面时候我发布两篇关于nacos源码的文章,一篇是聊一聊nacos是如何进行服务注册的,另一篇是一文带你看懂nacos是如何整合springcloud — 注册中心篇。…

    Java 2023年6月16日
    073
  • 缓存与数据库结合使用的痛点

    为什么缓存与数据库要结合使用,使用缓存的目的是为了减少用户请求穿透到服务端和数据库,尽量将资源放置在离用户更近的地方,让用户能够更快得到应答。在一些活动大促、秒杀场景中,经常会面临…

    Java 2023年6月16日
    080
  • Java 及 Kotlin 中的可变参数 vararg

    本文地址 目录 目录 Java 及 Kotlin 中的可变参数 vararg Java 中可变参数的规则 可变参数的本质是数组 Java 中对应数组 T[] Kotlin 中可能对…

    Java 2023年5月29日
    097
  • 3、spring+mybatis关联映射(无mapper实现类)+idea+maven

    该工程采用spring+mybatis的关联映射,动态sql,sql片段实现 1、搭建项目结构如下 2、配置项目的pom.xml文件中的依赖 1 <?xml version=…

    Java 2023年6月13日
    091
  • java基本数据类型之间的转换

    基本数据类型之间的相互转换分为两种,分别是自动类型转换和强制类型转换。 自动类型转换 当需要从低级类型向高级类型转换时,java会自动完成从低级类型向高级类型转换。低级类型是指取值…

    Java 2023年6月7日
    088
  • SpringSecurity 初始化流程源码

    SpringSecurity 初始化流程源码 本篇主要讲解 SpringSecurity初始化流程的源码部分,包括核心的 springSecurityFilterChain 是如何…

    Java 2023年6月9日
    076
  • Kubernetes-StorageClass

    1. 简介 StorageClass 为管理员提供了描述存储 “类” 的方法。 通过StorageClass的定义,管理员可以将存储资源定义为某种类别(Cl…

    Java 2023年6月7日
    098
  • Java通过继承外部类来建立该外部类的protected内部类的实例(转)

    原文链接:http://blog.sina.com.cn/s/blog_7de00ff60102xffx.html 如果想要在外部类的导出类(子类)中建立该外部类的为protect…

    Java 2023年5月29日
    094
  • 使用Gradle构建Java项目

    使用Gradle构建Java项目 这个手册将通过一个简单的Java项目向大家介绍如何使用Gradle构建Java项目。 我们将要做什么? 我们将在这篇文档中创建一个简单的Java项…

    Java 2023年5月29日
    072
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球