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

mysql 共享锁和排他锁

基础概念

MySQL中的锁机制用于控制多个事务对数据的并发访问。共享锁(Shared Locks)和排他锁(Exclusive Locks)是两种主要的锁类型。

共享锁(Shared Locks)

  • 允许多个事务同时读取同一数据行,但阻止其他事务获取该行的排他锁。
  • 共享锁通常用于读取操作。

排他锁(Exclusive Locks)

  • 只允许一个事务获取该数据行的排他锁,阻止其他事务获取共享锁或排他锁。
  • 排他锁通常用于写入操作。

相关优势

共享锁的优势

  • 提高并发读取的效率,允许多个事务同时读取同一数据行。

排他锁的优势

  • 确保数据的一致性和完整性,防止多个事务同时修改同一数据行。

类型

共享锁(S锁)

  • 表示事务正在读取数据行。

排他锁(X锁)

  • 表示事务正在修改数据行。

应用场景

共享锁的应用场景

  • 当多个事务需要读取同一数据行时,使用共享锁可以提高并发性能。

排他锁的应用场景

  • 当事务需要修改数据行时,使用排他锁可以确保数据的一致性和完整性。

常见问题及解决方法

问题1:死锁

  • 原因:两个或多个事务互相等待对方释放锁,导致无法继续执行。
  • 解决方法
    • 使用事务隔离级别来减少死锁的可能性。
    • 优化事务的执行顺序,尽量减少锁的持有时间。
    • 使用SHOW ENGINE INNODB STATUS命令查看死锁信息,并根据信息调整事务逻辑。

问题2:锁等待超时

  • 原因:事务等待获取锁的时间超过了设定的超时时间。
  • 解决方法
    • 增加锁等待超时时间,通过设置innodb_lock_wait_timeout参数。
    • 优化事务逻辑,减少锁的持有时间。
    • 使用SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODE语句显式地指定锁类型。

示例代码

代码语言:txt
复制
-- 获取共享锁
START TRANSACTION;
SELECT * FROM table_name WHERE id = 1 LOCK IN SHARE MODE;
-- 执行读取操作
COMMIT;

-- 获取排他锁
START TRANSACTION;
SELECT * FROM table_name WHERE id = 1 FOR UPDATE;
-- 执行写入操作
UPDATE table_name SET column1 = 'value' WHERE id = 1;
COMMIT;

参考链接

通过以上信息,您可以更好地理解MySQL中的共享锁和排他锁,并在实际开发中合理应用它们。

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

相关·内容

mysql共享排他

mysql机制分为表级行级,本文就和大家分享一下我对mysql中行级中的共享排他进行分享交流。...排他又称为写,简称X,顾名思义,排他就是不能与其他所并存,如一个事务获取了一个数据行的排他,其他事务就不能再获取该行的其他,包括共享排他,但是获取排他的事务是可以对数据就行读取修改...会查询到一条数据,现在打开另一个查询窗口,对同一数据分别使用排他共享查询两种方式查询 排他查 ?...我们看到开了排他查询共享查询都会处于阻塞状态,因为id=1的数据已经被加上了排他,此处阻塞是等待排他释放。 如果我们直接使用以下查询呢 ? ?...然后我们提交数据,释放排他看下修改后的数据,此时可用排他查,共享普通查询, 因为事务提交后该行数据释放排他,下面就只显示普通查询,其他的同学们自己去验证。 ? ?

1.8K20

MySQL 意向共享、意向排他、死锁

专栏持续更新中:MySQL详解 一、InnoDB表级 我们知道,InnoDB是支持行,但不是每次都获取行,如果不使用索引的,那还是获取的表。...除了挨个检查,没有更好的办法,这就导致效率低下的问题 我们这里学习的意向共享意向排他就是用来解决,由于需要加表而去挨个遍历数据,确定是否有某些数据被加了行,而导致的效率低下问题。...作用就是快速判断表里是否有记录被加锁 二、意向共享意向排他(表而非行) 意向的作用:为了可以更快速的获取表 意向共享(IS):事务在给一行记录加共享前,必须先取得该表的IS 意向排他...=8的排他,发生阻塞 事务2再次获取id=7的排他 此时由于MySQL Server检测到发生了死锁,于是解除事务1的阻塞,进行事务1的rollback,释放其占有的行,于是事务2成功获取id=7...的排他 两个事务发生死锁时,MySQL Server会选择一个事务释放并进行rollback 四、的优化建议 在能正确完成业务的前提下,为确保效率,尽量使用较低的隔离级别(必须避免脏读) 设计合理的索引并尽量使用索引访问数据

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

    并不是直接丢记录行加锁,而是对行对应的索引加锁: 如果sql 语句操作了主键索引,Mysql 就会锁定这条主键索引。...InnoDB引擎支持表级行级,默认为行级共享排他 共享: 有称之为S、读。...当前线程对共享资源加共享,其他线程可以读取此资源、可以继续追加共享,但是不能修改此资源、不能追加排他。...语法:select id from t_table in share mode; 多个共享可以共存,共享排他不能共存。 排他: 又称之为X、写。...当前线程对共享资源加排他,其他线程不允许读取此资源,不允许追加共享,不允许修改此资源,不允许追加排他

    1K20

    ✅什么是排他共享、意向

    当没有其他线程对查询结果集中的任何一行使用排他时,可以成功申请共享;否则会被阻塞。其他线程也可以读取已被共享保护的表,且这些线程读取的是同一版本的数据。排他排他又称为写。...FOR UPDATE;在查询语句后增加FOR UPDATE,MySQL会对查询结果中的每一行记录都加上排他。只有在没有其他线程对查询结果集中的任何一行使用排他时,才能成功申请排他;否则会被阻塞。...意向锁在MySQL的InnoDB引擎中,支持多种级别,其中包括行级表级。当多个事务需要访问同一共享资源时,如果每个事务都直接请求获取,可能会发生相互阻塞的情况,甚至可能导致死锁的产生。...因此,MySQL引入了意向机制。意向是数据库管理系统中用于实现协议的一种机制,旨在处理不同粒度(如行)之间的并发性问题。...意向有两种类型:意向共享意向排他。意向共享:表示事务打算在资源上设置共享(读)。通常用于表明事务计划读取资源,并希望在读取时不会有其他事务设置排他

    41211

    MySQL、行、排它共享

    此时会放弃使用索引,因此也不会使用行,而是使用表,比如对一些很小的表,MySQL就不会去使用索引 三、排它(Exclusive)共享(Shared) 排它,又称为X,写 共享,又称为...,阻塞了 我们尝试给id=7的数据加上共享,还是阻塞了 再获取id=8的共享排它 但是可以成功获取id=8的共享排它 总结:不同事务之间对于数据的,只有SS可以共存,XX、SX、XS都不能共存...因为现在name走的是索引, 通过zhangsan在辅助索引树上找到它所在行记录的id是7,然后到主键索引树上,获取对应行记录的排他MySQL Server会根据情况,在主键索引树辅助索引树上加锁...这条记录的索引项 事务2在辅助索引树上找zhangsan,找到对应的主键值,然后去主键索引树找到相应的记录,但是发现这行记录已经被共享锁住了,事务2可以获取共享,但是不能获取排他 我们用主键索引id...表级还是行级说的是的粒度,共享排他说的是的性质,不管是表还是行,都有共享排他的区分

    26340

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

    文章目录一、概述1.1 MySQL的由来1.2 锁定义1.3 分类二、共享排他2.1 共享(S)2.2 排他(X)2.3 MySQL的释放三、全局3.1 介绍 3.2 语法 3.3...因此从这个实验中可以得知:共享也具备排他性,会排斥其他尝试写的线程,当有线程尝试修改同一数据时会陷入阻塞,直至持有共享的事务结束才能继续执行2.2 排他(X)上面简单的了解了共享之后,紧着来看看排他...引擎中,获取表级别的共享排他的方式,但这里的关键词其实叫做READ、WEITE,翻译过来也就是读、写的意思,因此关于共享就是读排他就是写的说法,估计就是因此而来的。...排他(X):允许获取排他的事务更新数据,阻止其他事务获得相同数据集的共享排他。...,因为的粒度比较大,因此很多时候都会出现冲突,但对于表级,咱们只需要关注共享意向共享排他即可,其他的大多数为MySQL的隐式(在这里,共享意向排他意向,也可以理解为MyISAM中的表读表写

    6.3K65

    《深入理解共享lock in share mode排他for update区别》

    共享:又称读(lock in share mode),例如select,当上锁之后,另一个线程只可以读,不可以修改。...排他:又称写(for update),例如update,insert,delete,上锁之后,另一个线程不可以读修改。 的前提有两个:1、必须是mysql的innoDb表。...说到共享排他,就会想到悲观,这两个都属于数据库带的悲观,乐观不是数据库带的。...悲观:总是觉得数据随时被人更改,此次操作会对数据造成冲突,与java里的sychronizedreentrantlock悲观类似,效率比较低。...uid = '1' LOCK IN SHARE MODE; 这时候事务先不commit,开启的另一个数据库,同样执行上面两个sql,会发现,不管有没有执行commit,都能够查询,不会阻塞,这就是共享

    75420

    MySQL-25】万字总结<>——(全局&行级&表级)【共享排他】【间隙,临键】【表,元数据,意向

    前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎!...表达:S 【1】【行】(共享排他) 1.共享排他机制介绍 InnoDB实现了以下两种类型的行: 共享(S): 允许一个事务去读一行,阻止其他事务获得相同数据集的排它。...(共享之间是兼容的 ,共享排他互斥) 排他(X): 允许获取排他的事务更新数据,阻止其他事务获得相同数据集的共享排他。...(一个数据有了排他,就与其他共享排他互斥) 2.不同SQL下,行的情况 分成两种,一种是增删改;另一种是查询 3.演示行 默认情况下,InnODB在 REPEATABLE READ事务隔离级别运行...B: 我们想加一个表,我们先看有无意向,再看所要加的表与原来的意向是否兼容(读/写) ,不兼容则进入阻塞状态,直到线程A提交 2.意向的相关语法(意向共享&意向排他)(包含语法演示)

    11610

    并发(二):共享独占

    首先,我们要分清楚,有2种,共享,以及独占 共享 共享用于某个文件不会被写,或者不会被更新(也就是只读)的情况,加了共享的文件,只能再加共享,而不能加独占 例如: $file = fopen...同样,如果在上了共享的情况,增加独占,则该进程会阻塞,直到共享释放: <?...,关于操作这个文件的代码,都需要增加锁,不管是独占还是共享,否则数据还是会出现问题 例如: 当加好共享之后,运行这段代码: <?...独占 独占用于数据可能会被修改的文件,当一个进程加上独占之后,其他进程将不能增加独占共享(将会阻塞) 测试代码: <?...,都需要增加锁,不管是独占还是共享,否则数据还是会出现问题 <?

    1.6K21

    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共享排它 (1)—mysql进阶(六十八)

    前面说了为了解决脏读,幻读,不可重复读,mysql设置了四种隔离级别,read committedread uncommitted会发生幻读不可重复读,repeatable read会发生不可重复读...锁定读(locking read) 共享独占 前面说过并发的情况下 读-读 不会有问题,不过对于 写-写,读-写,写-读这些情况可能引引起一些问题,需要使用mvcc或者加锁的方式来解决。...在使用加锁的方式解决问题时候,mysql设计了两个的分类: 共享:shared locks,简称s。事务读取一条记录时候,必须先获取该记录的。...Update: 如果对一条记录修改操作时候分为三种情况: 如果未修改这个主键值,并且存储空间没有发生变化,则直接就地修改,在b+树定位这条记录的位子,然后在获取这个记录的排他,最后在原记录的位子就行修改操作...其实一个事务也可以在表级别进行加锁,自然称为表级或者表,对表加锁我们可以说这个的颗粒度比较粗,给表加锁分为共享排它: 1、给表加s: 如果一个事务给表加s,那么, 别的事务可以继续获得该表的

    64910

    数据库:MySQL 中 “select ... for update” 排他分析

    Mysql InnoDB 排他 场景分析 测试环境 总结 参考资料 ---- Mysql InnoDB 排他 用法:select … for update; 例如:select * from goods...where id = 1 for update; 排他的申请前提:没有线程对该结果集中的任何行数据使用排他共享,否则申请会阻塞。...在进行事务操作时,通过“for update”语句,MySQL会对查询结果集中每行数据都添加排他,其他线程对该记录的更新与删除操作都会阻塞。排他包含行、表。...有两种解决方案: 悲观方案:每次获取商品时,对该商品加排他。也就是在用户A获取获取 id=1 的商品信息时对该行记录加锁,期间其他用户阻塞等待访问该记录。悲观适合写入频繁的场景。...2、由于MySQL的行是针对索引加的,不是针对记录加的,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现冲突的。应用设计的时候要注意这一点。

    1.7K40

    利用LockSupport实现互斥共享

    LockSupport是一个非常底层的API,我们利用其可以做很多事情,本文将利用LockSupport实现互斥共享。...Lock 在JDK中已经提供了很多种的实现,原生的synchronized(优先推荐使用),juc中的ReentrantLock等,本文不纠结synchronizedReentrantLock的实现...newCondition();在锁上新建Condition 以上的关于的语义稍微复杂了点,特别是相应中断部分newCondition部分,所以这次实现上简化了Lock的语义如下: void...AtomicInteger,利用了CAS来维持的状态 共享 public class ShareLock implements Lock { private volatile Set<Thread...don't own this lock."); } state.getAndIncrement(); } } 总结 以上利用了LockSupport来实现了互斥共享

    1K20

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

    独占:指该一次只能被一个线程所持有。对ReentrantLockSynchronized而言都是独占 共享:指该可被多个线程所持有。...对ReentrantReadWriteLock其读共享,其写是独占。 读共享可保证并发读是非常高效的,读写,写读,写写的过程是互斥的。...使用方法 声明一个读写 如果需要独占则加从可重入读写里得到写demo 如果需要共享则加从可重入读写里得到读demo ReentrantReadWriteLock实现原理简单分析...ReentrantReadWriteLock 的核心是由一个基于AQS的同步器 Sync 构成,然后由其扩展出 ReadLock (共享), WriteLock (排它)所组成。...是基于AQS实现的,在AQS中核心是state字段双端队列,那么一个一个问题来分析。

    1.4K30

    MySQL 全局、表

    // MySQL 全局、表 // 最近在极客时间看丁奇大佬的《MySQL45讲》,真心觉得讲的不错,把其中获得的一些MySQL方向的经验整理整理分享给大家,有兴趣同学可以购买相关课程进行学习...今天分享的内容是MySQL的全局、表。...我们知道MySQL自带的mysqldump逻辑备份工具可以使用--single-transaction参数来进行备份,因为Innodb存储引擎支持事务MVCC的原理,所以该备份方法没有问题。...在T2T3之间,在表上增加了一列,则报错 Table definition has changed, please retry transaction MySQL备份中止 在T3期间到达,则因为此时正在备份...,mysqldump占着t1的MDL读,binlog被阻塞,现象:主从延迟,直到T4执行完成 在T3T4之间到达,则没有影响,因为mysqldump已经释放了MDL读

    4.4K20

    数据库:MySQL 中 “select ... for update” 排他分析

    Mysql InnoDB 排他 用法:select … for update; 例如:select * from goods where id = 1 for update; 排他的申请前提:没有线程对该结果集中的任何行数据使用排他共享...在进行事务操作时,通过“for update”语句,MySQL会对查询结果集中每行数据都添加排他,其他线程对该记录的更新与删除操作都会阻塞。排他包含行、表。...有两种解决方案: 悲观方案:每次获取商品时,对该商品加排他。也就是在用户A获取获取 id=1 的商品信息时对该行记录加锁,期间其他用户阻塞等待访问该记录。悲观适合写入频繁的场景。...如果其他线程按非主键不含索引字段进行查询,则非主键不含索引字段产生表,如果其他线程按非主键含索引字段进行查询,则非主键含索引字段产生行,如果索引值是枚举类型,mysql也会进行表,这段话有点拗口,...2、由于MySQL的行是针对索引加的,不是针对记录加的,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现冲突的。应用设计的时候要注意这一点。

    3.4K30
    领券