首页
学习
活动
专区
工具
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.4K30
  • MySQL 意向共享、意向排他、死锁

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

    97740

    MySQL、行、排它共享

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

    26440

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

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

    64910

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

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

    1K20

    Java独占共享

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

    25810

    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这样默认表序列,完成表。

    72230

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

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

    1.4K30

    并发(二):共享和独占

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

    1.6K21

    AQS之共享

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

    68710

    ✅什么是排他共享、意向

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

    41211

    linux读写_共享内存读写

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

    6.2K10

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

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

    55130

    Java并发编程:AQS互斥共享

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

    1.3K40

    理解AbstractQueuedSynchronizer提供独占共享语义

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

    95820

    Java 并发编程:AQS 互斥共享

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

    60350

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

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

    6.3K65
    领券