首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql的共享锁

基础概念

MySQL中的共享锁(Shared Locks),也称为读锁,是一种允许多个事务同时读取同一数据行的锁机制。当一个事务获取了共享锁,其他事务也可以获取共享锁,但不能获取排他锁(Exclusive Locks),直到共享锁被释放。

优势

  1. 并发性:允许多个事务同时读取数据,提高了系统的并发性能。
  2. 数据一致性:确保读取的数据在事务开始时是一致的,防止脏读。

类型

MySQL中的共享锁主要分为两种类型:

  1. 表级共享锁:锁定整个表,阻止其他事务对表进行写操作。
  2. 行级共享锁:锁定特定的数据行,阻止其他事务对同一行进行写操作。

应用场景

共享锁常用于以下场景:

  1. 读取操作:当多个事务需要同时读取同一数据行时,使用共享锁可以避免数据不一致的问题。
  2. 防止脏读:确保读取的数据在事务开始时是一致的。

遇到的问题及解决方法

问题:为什么会出现死锁?

原因:死锁通常发生在两个或多个事务互相等待对方释放锁的情况下。例如,事务A持有共享锁并等待获取排他锁,而事务B持有排他锁并等待获取共享锁。

解决方法

  1. 设置超时时间:为事务设置超时时间,当事务等待锁的时间超过设定值时,自动回滚事务。
  2. 优化事务顺序:确保所有事务以相同的顺序获取锁,减少死锁的可能性。
  3. 使用死锁检测:数据库系统可以自动检测并解决死锁问题,例如MySQL InnoDB引擎会自动检测并回滚其中一个事务以解决死锁。

示例代码

以下是一个简单的示例,展示如何在MySQL中使用共享锁:

代码语言:txt
复制
-- 开启事务
START TRANSACTION;

-- 获取行级共享锁
SELECT * FROM table_name WHERE id = 1 LOCK IN SHARE MODE;

-- 执行其他读取操作
-- ...

-- 提交事务
COMMIT;

参考链接

希望这些信息对你有所帮助!如果你有更多问题,欢迎继续提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

mysql共享锁与排他锁

mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流。...排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改...mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select …for...我们看到是可以查询数据的,但加排他锁就查不到,因为排他锁与共享锁不能存在同一数据上。...最后我们验证下上面说的mysql InnoDb引擎中update,delete,insert语句自动加排他锁的问题, ? ?

1.8K20

MySQL中的锁(表锁、行锁,共享锁,排它锁,间隙锁)

MyISAM表锁 MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。...排他锁(X):又称写锁。允许获取排他锁的事务更新数据,阻止其他事务取得相同的数据集共享读锁和排他写锁。...意向共享锁(IS):事务打算给数据行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。 意向排他锁(IX):事务打算给数据行加排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。...事务可以通过以下语句显式给记录集加共享锁或排他锁: 共享锁(S):mysql SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。...对于MyISAM的表锁,主要讨论了以下几点: (1)共享读锁(S)之间是兼容的,但共享读锁(S)与排他写锁(X)之间,以及排他写锁(X)之间是互斥的,也就是说读和写是串行的。

2.5K30
  • MySQL 意向共享锁、意向排他锁、死锁

    专栏持续更新中:MySQL详解 一、InnoDB表级锁 我们知道,InnoDB是支持行锁,但不是每次都获取行锁,如果不使用索引的,那还是获取的表锁。...除了挨个检查,没有更好的办法,这就导致效率低下的问题 我们这里学习的意向共享锁和意向排他锁就是用来解决,由于需要加表锁而去挨个遍历数据,确定是否有某些数据被加了行锁,而导致的效率低下问题。...作用就是快速判断表里是否有记录被加锁 二、意向共享锁和意向排他锁(表锁而非行锁) 意向锁的作用:为了可以更快速的获取表锁 意向共享锁(IS锁):事务在给一行记录加共享锁前,必须先取得该表的IS锁 意向排他锁...与此同时,由于mysqld(MySQL Server守护进程)设置了事务阻塞的超时时间,事务不会阻塞很长时间,超时后事务处理失败,自动释放当前占有的锁 3....=8的排他锁,发生阻塞 事务2再次获取id=7的排他锁 此时由于MySQL Server检测到发生了死锁,于是解除事务1的阻塞,进行事务1的rollback,释放其占有的行锁,于是事务2成功获取id=7

    1K40

    MySQL表锁、行锁、排它锁和共享锁

    专栏持续更新中:MySQL详解 事务隔离级别的实现原理:简单来说就是各种锁机制和MVCC多版本并发控制 我们学习知识的时候,需要了解知识点出现的原因,什么情况下能用到这个知识 我们说到事务,就得说到事务的...InnoDB引擎下表的不同行,但如果使用相同的索引字段作为过滤条件,依然会发生锁冲突,只能串行进行,不能并发进行 即使SQL中使用了索引,但是经过MySQL的优化器后,如果认为全表扫描比使用索引效率高,...此时会放弃使用索引,因此也不会使用行锁,而是使用表锁,比如对一些很小的表,MySQL就不会去使用索引 三、排它锁(Exclusive)和共享锁(Shared) 排它锁,又称为X锁,写锁 共享锁,又称为...,阻塞了 我们尝试给id=7的数据加上共享锁,还是阻塞了 再获取id=8的共享锁和排它锁 但是可以成功获取id=8的共享锁和排它锁 总结:不同事务之间对于数据的锁,只有SS锁可以共存,XX、SX、XS都不能共存...表级锁还是行级锁说的是锁的粒度,共享锁和排他锁说的是锁的性质,不管是表锁还是行锁,都有共享锁和排他锁的区分

    29340

    Mysql锁共享锁排它锁 (1)—mysql进阶(六十八)

    写-写 的情况:并发事务相继对相同的记录做出改动 我们前面说过这种情况就是脏写,脏写是在mysql四种隔离级别情况下都是不允许发生的。...锁定读(locking read) 共享锁和独占锁 前面说过并发的情况下 读-读 不会有问题,不过对于 写-写,读-写,写-读这些情况可能引引起一些问题,需要使用mvcc或者加锁的方式来解决。...在使用加锁的方式解决问题时候,mysql设计了两个锁的分类: 共享锁:shared locks,简称s锁。事务读取一条记录时候,必须先获取该记录的锁。...Insert: 一般来说,新插入的数据不需要加锁,mysql提供一种隐式锁来保护这条新数据在事务提交之前,不被其他事物来访问。...其实一个事务也可以在表级别进行加锁,自然称为表级锁或者表锁,对表加锁我们可以说这个锁的颗粒度比较粗,给表加锁分为共享锁和排它锁: 1、给表加s锁: 如果一个事务给表加s锁,那么, 别的事务可以继续获得该表的

    65710

    MySQL:表级锁、行级锁、共享锁、排他锁、乐观锁、悲观锁

    并不是直接丢记录行加锁,而是对行对应的索引加锁: 如果sql 语句操作了主键索引,Mysql 就会锁定这条主键索引。...如果sql语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。 在InnoDB中,如果SQL语句不涉及索引,则会通过隐藏的聚簇索引来对记录加锁。...InnoDB引擎支持表级锁和行级锁,默认为行级锁。 共享锁与排他锁 共享锁: 有称之为S锁、读锁。...当前线程对共享资源加共享锁,其他线程可以读取此资源、可以继续追加共享锁,但是不能修改此资源、不能追加排他锁。...当前线程对共享资源加排他锁,其他线程不允许读取此资源,不允许追加共享锁,不允许修改此资源,不允许追加排他锁。

    1.1K20

    Java的独占锁和共享锁

    共享锁 在Java中,共享锁(Shared Lock)是一种允许多个线程同时读取资源,但在写入资源时只允许一个线程独占的锁。...Java的java.util.concurrent.locks包中的ReentrantReadWriteLock类就是一种实现了共享锁和独占锁(排他锁)机制的读写锁。...在这个锁中,读锁是共享的,写锁是独占的。...在公平模式下,等待时间最长的线程将优先获得锁;而在非公平模式下,锁的分配不保证任何特定的顺序,新到来的线程可能立即获得锁。 要注意的是,尽管读锁是共享的,但写锁是独占的,并且写锁具有更高的优先级。...使用共享锁可以显著提高读取密集型应用的性能,因为它允许多个读取线程并发执行,而写入密集型应用可能会因为写锁的竞争而受到限制。

    29210

    MySQL中的表锁行锁共享锁很难吗?看了本文就清楚了哦

    MySQL数据库中的锁还是非常重要的,本文重点给大家详细的来介绍下MySQL数据中的各种锁。...3.表锁和行锁对比 锁定粒度:表锁 > 行锁 加锁效率:表锁 > 行锁 冲突概率:表锁 > 行锁 并发性能:表锁 锁 二、锁的细分 锁名 锁级别 英文名称 共享锁 行锁 Shared Locks...排它锁 行锁 Exclusive Locks 意向共享锁 表锁 Intention Shared Locks 意向排它锁 表锁 Intention Exclusive Locks 1.共享锁   又称为读锁...表示事务准备给数据行加入共享锁,也就是一个数据行加共享锁前必须先取得该表的IS锁 意向排它锁(Intention Exclusive Lock,简称IX锁)表示事务准备给数据行加入排它锁,说明事务在一个数据行加排它锁前必须先获得该表的...2.MySQL中锁的本质   在MySQL数据库中,锁的本质就是对索引打上标记,如果当前表没有索引,则直接找到sequence/rownum这样的默认表序列,完成锁表。

    72430

    独占锁(写锁)共享锁(读锁)互斥锁

    独占锁:指该锁一次只能被一个线程所持有。对ReentrantLock和Synchronized而言都是独占锁 共享锁:指该锁可被多个线程所持有。...对ReentrantReadWriteLock其读锁是共享锁,其写锁是独占锁。 读锁的共享锁可保证并发读是非常高效的,读写,写读,写写的过程是互斥的。...使用方法 声明一个读写锁 如果需要独占锁则加从可重入读写锁里得到写锁 写锁demo 如果需要共享锁则加从可重入读写锁里得到读锁 读锁demo ReentrantReadWriteLock实现原理简单分析...ReentrantReadWriteLock 的核心是由一个基于AQS的同步器 Sync 构成,然后由其扩展出 ReadLock (共享锁), WriteLock (排它锁)所组成。...方法,其中关于AQS的升级降级锁个数的调整还用到了CAS; 读写锁实现原理详解

    1.4K30

    并发锁(二):共享锁和独占锁

    首先,我们要分清楚,锁有2种,共享锁,以及独占锁 共享锁 共享锁用于某个文件不会被写,或者不会被更新(也就是只读)的情况,加了共享锁的文件,只能再加共享锁,而不能加独占锁 例如: $file = fopen...同样,如果在上了共享锁的情况,增加独占锁,则该进程会阻塞,直到共享锁释放: 锁,则共享锁会被阻塞,不做详细说明 注意事项 共享锁加上之后,虽然不能再加上独占锁进行独占写入,但是还是会被未加锁的进程影响,所以注意,当你确定某个文件是只读,或者说读取的时候不被写入影响时...,关于操作这个文件的代码,都需要增加锁,不管是独占锁还是共享锁,否则数据还是会出现问题 例如: 当加好共享锁之后,运行这段代码: 共享锁也会出现一样的情况(不做测试) 注意事项 独占锁加上之后,虽然其他进程无法加共享锁以及独占锁,但是可以直接写入文件,同样会造成数据污染,所以注意,当你确定某个文件确定需要加锁时,关于操作这个文件的代码

    1.7K21

    AQS之共享锁

    共享模式下, tryAcquireShared返回值的特点是:小于0代表获取锁失败;等于0代表本次获取锁成功,但随后的获取将返回失败,也就是此刻这是共享模式下的最后一把锁,除非接下来有人释放锁,否则你获取不了...(非取消状态),如果为取消状态,则找其前驱的前驱 共享模式下,当一个线程获得锁的时候,会调用setHeadAndPropagate方法,如果此时同步器中还有可用的锁,则会调用doReleaseShared...tryAcquireShared返回值特点:小于0代表获取锁失败;等于0代表本次获取锁成功,但随后的获取将返回失败,也就是此刻这是共享模式下的最后一把锁,除非接下来有人释放锁,否则你获取不了;大于0代表本次获取锁成...,共享锁代表在同一时刻可以有多个线程获取锁,具体有几个线程由用户自己决定;而独占锁代表同一个时刻只能由一个线程获取锁 即然同一时刻可以有多个线程获取锁,那在释放锁的时候,怎么尽快的唤醒其它阻塞的节点呢?...这就涉及到共享锁的传播 当一个线程获得锁的时候,会调用setHeadAndPropagate方法,如果此时同步器中还有可用的锁,则会调用doReleaseShared方法唤醒下一个节点,这就是传播 当一个线程释放锁的时候

    69410

    ✅什么是排他锁、共享锁、意向锁

    共享锁共享锁,又被称为读锁,是由读取操作所创建的一种锁。在此期间,其他用户可以同时读取数据,但在数据上未释放所有共享锁之前,任何事务均无法对其进行修改(即获取数据的排他锁)。...LOCK IN SHARE MODE;在查询语句后增加LOCK IN SHARE MODE,MySQL会对查询结果中的每一行都加上共享锁。...意向锁在MySQL的InnoDB引擎中,支持多种锁级别,其中包括行级锁和表级锁。当多个事务需要访问同一共享资源时,如果每个事务都直接请求获取锁,可能会发生相互阻塞的情况,甚至可能导致死锁的产生。...但是,事务B显然不能遍历整个表的数据逐条进行判断是否有加锁。因此,MySQL引入了意向锁机制。意向锁是数据库管理系统中用于实现锁协议的一种机制,旨在处理不同锁粒度(如行锁和表锁)之间的并发性问题。...意向锁并非由用户直接请求,而是由MySQL管理的。当一个事务请求获取行级锁或表级锁时,MySQL会自动获取相应表的意向锁。

    53411

    linux读写锁_共享内存读写锁

    读写锁其实还是一种锁,是给一段临界区代码加锁,但是此加锁是在进行写操作的时候才会互斥,而在进行读的时候是可以共享的进行访问临界区的 ps:读写锁本质上是一种自旋锁 二、为什么需要读写锁?...,只是做一些查询,所以在读的时候不用给此段代码加锁,可以共享的访问,只有涉及到写的时候,互斥的访问就好了 三、读写锁的行为 读写之间是互斥的—–>读的时候写阻塞,写的时候读阻塞,而且读和写在竞争锁的时候...1.自旋锁 自旋锁是在发生获取不到锁的时候,会直接等待,不会被CPU直接调度走,而是会一直等到获取到锁,因为此锁是一直的在等待,所以不会有调度的开销,故此锁的效率比挂起等待锁的效率高,但是此锁会因不停的查看锁的释放情况...,故会浪费更多的CPU资源 2.挂起等待锁 挂起等待锁是当某线程在执行临界区的代码时,那其他线程只能挂起等待,此时这些线程会被CPU调度走,等到锁释放(即就是临界区的代码被之前的那个线程已经执行完毕...),而且被CPU调度的线程只有被调度回来才可以执行临界区的代码 挂起等待锁是在发生获取不到锁的时候,他会被CPU调度走,去做别的事,但是会时不时的去查看锁有没有被释放 ps:线程想执行临界区的代码的条件

    6.2K11

    【JavaP6大纲】MySQL篇:悲观锁、乐观锁、排它锁、共享锁、表级锁、行级锁,死锁

    悲观锁、乐观锁、排它锁、共享锁、表级锁、行级锁,死锁? 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。...适用于写为居多的场景下。比如行锁,表锁等,读锁,写锁,syncronized实现的锁等。...sql中实现悲观锁,使用for update对数据加锁,例如:select num from goods where id = 1 for update; 乐观锁:每次去拿数据的时候都认为别人不会修改,...适用于读为居多的场景下。乐观锁适用于多读的应用类型,这样可以提高吞吐量。...工作流程: 获取当前数据版本 更新操作版本号+1 提交更新时,获取版本号 比较提交时的版本号与第一次获取的版本号,如果一致,那么认为资源是最新的,可以更新 否则回滚或者抛出异常 案例: 事务一开启

    55630

    Java并发编程:AQS的互斥锁与共享锁

    实现同步机制可以通过锁来实现,所以AQS框架也抽象出了锁的获取操作和释放操作。而且还提供了包括独占锁和共享锁两种模式,这样对于上层的各种同步器的实现就方便很多了。 ?...if(尝试释放锁成功){ 唤醒后续节点包含的线程 } 05 共享锁 共享锁是指该锁可以由多个线程所持有,多个线程都能同时获得该锁,而不必等到持有锁的线程释放该锁。...比如一般我们所说的读锁就是共享锁,一个共享数据是可以被多个线程去读取的,只要它们都不改变共享数据就不会有数据竞争问题。...获取共享锁和释放共享锁分别对应acquireShared方法和releaseShared方法。获取共享锁的主要逻辑为:先尝试获取锁,成功则往下执行,否则把线程放到等待队列中并可能将线程挂起。...释放共享锁的主要逻辑为:唤醒等待队列中一个或多个线程去尝试获取锁。在AQS中可以用以下伪代码表示共享锁的获取与释放。 - END -

    1.3K40

    Java 并发编程:AQS 的互斥锁与共享锁

    而且还提供了包括独占锁和共享锁两种模式,这样对于上层的各种同步器的实现就方便很多了 独占锁 独占锁是指该锁一次只能由一个线程持有,其它线程则无法获得,除非已持有锁的线程释放了该锁。...){ 唤醒后续节点包含的线程 } 共享锁 获取共享锁和释放共享锁分别对应acquireShared方法和releaseShared方法。...获取共享锁的主要逻辑为:先尝试获取锁,成功则往下执行,否则把线程放到等待队列中并可能将线程挂起。释放共享锁的主要逻辑为:唤醒等待队列中一个或多个线程去尝试获取锁。...在AQS中可以用以下伪代码表示共享锁的获取与释放。...并发编程:任务执行器Executor接口 Java 并发编程:AQS 的互斥锁与共享锁 Java并发编程:什么是JDK内置并发框架AQS Java并发编程:AQS的原子性如何保证 Java并发编程:如何防止在线程阻塞与唤醒时死锁

    60350

    理解AbstractQueuedSynchronizer提供的独占锁和共享锁语义

    ,完全是使用Java语言层面功能配合上轻量级的CAS自旋锁来构建的抽象同步器,总的来说AQS里面包含了二套api语义一种是独占锁,另一种是共享锁。...AQS共享锁的申请和释放流程 这里以CountDownLatch的await分析:首先在构造函数里面我们需要传入一个阻塞的线程个数这里假设为3,在构造函数里面会设置AQS的state字段值为3。...(1)申请共享锁sync.acquireSharedInterruptibly(1) (2)调用tryAcquireShared(arg) < 0判断是否有资格申请: 这个方法需要子类实现 protected...简单的来说共享锁的释放类似,排队的人,第一个告诉第二个你可以执行了,然后第二个完事,告诉第三个依次类推直到所有的共享锁得到释放。...总结 借用Java并发编程的艺术里面术语来说,锁是面向使用者的,而AQS则是面向实现者也或开发者,AQS抽象了锁的状态管理,同步队列的,等待与唤醒等功能,简化了锁的实现方式,从而很好的隔离了使用者和实现者所关注的重点

    96120

    MySQL锁、加锁机制(超详细)—— 锁分类、全局锁、共享锁、排他锁;表锁、元数据锁、意向锁;行锁、间隙锁、临键锁;乐观锁、悲观锁

    文章目录一、概述1.1 MySQL锁的由来1.2 锁定义1.3 锁分类二、共享锁与排他锁2.1 共享锁(S锁)2.2 排他锁(X锁)2.3 MySQL锁的释放三、全局锁3.1 介绍 3.2 语法 3.3.../ X锁:不同事务之间会相互排斥、同时只能允许一个事务获取的锁共享排他锁 / SX锁:MySQL5.7版本中新引入的锁,主要是解决SMO带来的问题以操作类型的维度划分读锁:查询数据时使用的锁写锁:执行插入...在MySQL中,我们可以在SQL语句后加上相关的关键字来使用共享锁,语法如下:SELECT ......样例:做个关于共享锁的小测试,先打开两个cmd窗口并于mysql建立连接-- 窗口1:-- 开启一个事务begin;-- 获取共享锁并查询 id=2 的数据select * from bank_balance...,因为锁的粒度比较大,因此很多时候都会出现冲突,但对于表级锁,咱们只需要关注共享意向锁和共享排他锁即可,其他的大多数为MySQL的隐式锁(在这里,共享意向锁和排他意向锁,也可以理解为MyISAM中的表读锁和表写锁

    11.9K810

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券