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

mysql事务加共享锁

基础概念

MySQL中的事务是一组一起执行或都不执行的SQL语句。事务用于确保数据的完整性和一致性。共享锁(Shared Locks),也称为读锁,允许多个事务同时读取同一条记录,但不允许其他事务获取排他锁(Exclusive Locks),即不允许写操作。

相关优势

  1. 数据一致性:通过共享锁,可以确保在事务读取数据时,数据不会被其他事务修改,从而保证数据的一致性。
  2. 并发性:允许多个事务同时读取同一条记录,提高了系统的并发性能。

类型

MySQL中的锁主要有两种类型:

  1. 共享锁(Shared Locks):允许多个事务同时读取同一条记录。
  2. 排他锁(Exclusive Locks):只允许一个事务读取或修改记录,其他事务不能获取共享锁或排他锁。

应用场景

共享锁通常用于以下场景:

  1. 多读少写:当系统中读操作远多于写操作时,共享锁可以提高系统的并发性能。
  2. 数据一致性:在读取数据时,确保数据不会被其他事务修改。

遇到的问题及解决方法

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

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

解决方法

  1. 设置超时时间:通过设置事务的超时时间,当事务等待锁的时间超过设定值时,自动回滚事务。
  2. 设置超时时间:通过设置事务的超时时间,当事务等待锁的时间超过设定值时,自动回滚事务。
  3. 优化事务:尽量减少事务的持有时间,避免长时间持有锁。
  4. 按顺序加锁:确保所有事务按相同的顺序获取锁,避免循环等待。

问题:如何使用共享锁?

示例代码

代码语言:txt
复制
START TRANSACTION;

SELECT * FROM table_name WHERE id = 1 LOCK IN SHARE MODE;

-- 其他读操作

COMMIT;

参考链接

总结

MySQL事务中的共享锁允许多个事务同时读取同一条记录,但不允许写操作。共享锁在多读少写的场景中非常有用,可以提高系统的并发性能并保证数据的一致性。然而,需要注意死锁问题,并通过设置超时时间、优化事务和按顺序加锁等方法来解决。

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

相关·内容

mysql共享与排他

mysql机制分为表级和行级,本文就和大家分享一下我对mysql中行级中的共享与排他进行分享交流。...共享又称为读,简称S,顾名思义,共享就是多个事务对于同一数据可以共享一把,都能访问到数据,但是只能读不能修改。...排他又称为写,简称X,顾名思义,排他就是不能与其他所并存,如一个事务获取了一个数据行的排他,其他事务就不能再获取该行的其他,包括共享和排他,但是获取排他事务是可以对数据就行读取和修改...排他指的是一个事务在一行数据加上排他后,其他事务不能再在其上其他的。...update语句,共享可以使用select … lock in share mode语句。

1.8K20

MySQL类型&事务

类型 按照功能化分:读和写; 按照作用范围分:表级和行级;  功能 读:又称“共享”,是指多个事务可以共享一把,都只能访问数据,并不能修改。...写:又称“排他”,是不能和其他事务共享数据的,如果一个事务获取到了一个数据的排他,那么其他事务就不能再获取该行的其他,包括共享和排他。  ...范围 所谓的策略,是在的开销和数据的安全之间寻求平衡,这种平衡会影响到性能。 行:只锁住特定行的数据,并发能力强,MySQL一般都是用行来处理并发事务。...):MVVC在每一行记录的后面两个隐含列(记录创建版本号和删除版本号)。...这里引入了两种行级共享:英文名为Shared Locks,简称S。允许事务读一行数据。 排它:也常称独占,英文名为Exclusive Locks,简称X。允许事务删除或更新一行数据。

86411
  • MySQL事务(一)MySQL事务隔离级别、机制

    MySQL 在数据库中,是一种机制,用于协调多个并发事务对数据资源的访问。除了传统的计算资源(CPU、RAM、IO 等资源)竞争外,数据也是一种需要共享并发访问的资源。...从对数据库操作的类型分 读共享,S Shared):在事务读取数据时加锁,其他事务可以读取同一数据,但不能进行写操作。即针对同一份数据,多个读操作不会受影响。...意向(I Intention Lock):针对于表,是MySQL 数据库本身的。...意向共享,IS,对整个表共享之前,需要先获取到意向共享。 意向排他,IX,对整个表加排他之前,需要先获取到意向排他。...小结 对MyISAM表的读操作() ,不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读释放后,才会执行其它进程的写操作。

    48910

    MySQL事务与乐观

    解锁阶段:当事务释放了一个封锁之后,事务进入解锁阶段,在该阶段只能进行解锁操作而不能再加锁。 两段协议可以保证事务的并发调度串行化(串行化很重要,尤其是在数据恢复和备份的时候),但是无法避免死锁。...Update加行 如果update更新的where语句中的筛选条件没有索引,会导致MYSQL给整张表的所有数据加行。...但是实际使用过程中,mysql做了一些改进,在MYSQL过滤条件,发现不满足之后,会调用unlock_row方法,把不满足条件的纪录释放(违背了二段协议的约束)。...for update; insert; update ; delete; Next-Key防止别的事务修改或删除,GAP防止别的事务新增,行和GAP结合形成的的Next-Key共同解决了...参考文档: Innodb中的事务隔离级别和的关系

    1.4K30

    MySQL InnoDB 事务

    标准行级共享和排它 特殊的:意向 一致性非锁定性读: 指InnoDB存储引擎通过行多版本控制的方式读取当前执行时间数据库中行的数据,如果读取的行正在执行delete或者update...,而这要求数据库支持加锁语句,innodb对于select语句支持两种一致性的锁定读操作: select … for update 对读取的行一个X,其他事务不能对已锁定的行任何 select...… lock in share mode 对读取的行一个S,其他事务可以向已锁定的行S,但是X会阻塞 对于一致性非锁定性读,即使读取的行已经加了X,也是可以被读取的。...,需要让事务在这种情况下串行化,而不是并行化 阻塞:因为不同之间的兼容问题,某些时刻一个事务中的需要等待另一个事务释放它占用的资源 死锁:两个或两个以上的事务在执行过程中,因争夺资源而造成相互等待的现象...read-committed) 否 是 是 可重复读(repeatable-read) 否 否 是 串行化(serializable) 否 否 否 参考: 高性能MySQL 第3版 MySQL技术内幕

    81530

    Mysql事务

    Mysql事务 平时的业务中,顶多也就是写写简单的sql,连事务都用的少,对这一块的了解就更加欠缺了,之前一个大神分享了下mysql事务隔离级别,感觉挺有意思的,正好发现一个很棒的博文,然后也收集了一些相关知识...,正好来学习下,mysql事务的神秘面纱,主要内容包括 共享和排它的区别以及适合范围 mysql的表和行的区别 怎么判断一个sql是否执行了,执行的是表还是行 事务是什么,怎么用 事务的特性... 在学习多线程时,我们也经常会遇到这个东西,那个时候谈的比较多的是乐观和悲观,那这两种和DB中常说的共享和独占有什么区别呢?...共享和排它 a....共享 突出在共享这个关键词上,顾名思义,表示这个可以多人共享,一般又可以称为读(S) 在DB中,读表示所有的读取数据的小伙伴都不会被阻塞,可以放心大胆的获取数据,专业一点的说法就是同一时刻,

    1.3K130

    MySQL 机制和事务

    InnoDB 机制 InnoDB存储引擎支持行级 其大类可以细分为共享和排它两类 共享(S):允许拥有共享事务读取该行数据。...当一个事务拥有一行的共享时,另外的事务可以在同一行数据也获得共享,但另外的事务无法获得同一行数据上的排他 排它(X):允许拥有排它事务修改或删除该行数据。...当一个事务拥有一行的排他时,另外的事务在此行数据上无法获得共享和排它,只能等待第一个事务释放 除了共享和排他之外, InnoDB也支持意图。...该类型是属于表级,表明事务在后期会对该表的行施加共享或者排它。...所以对意图也有两种类型: 共享意图(IS): 事务将会对表的行施加共享 排他意图(IX): 事务将会对表的行施加排它 举例来说select … for share mode语句就是施加了共享意图

    78710

    mysql事务

    演示是否有不能重复读问题: 1 事务 1.1 事务特性 事务的基本要素(ACID) 1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。...4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。 1.2 隔离级别 因为有多个事务,各个事务之间有没有影响呢?所以就有了隔离级别。...遇到的问题就是: mysql默认的事务隔离级别为repeatable-read; 1.3 实战解释各个级别遇到的问题 我们先创建一个表: 1.3.1 查询当前数据库的隔离级别 select...@@tx_isolation; 1.3.2 进行测试 我们首先查询出一条数据 select num from user where id=1; 当前mysql数据库事务的隔离级别是 可重复读,...说明在当前的mysql数据库,没有脏读问题,因为一个事务改变了数据,没有提交的情况下,其他事务是不可能读取到还没有提交的数据 1.3.2.2 演示是否有不能重复读问题:

    42620

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

    除了挨个检查,没有更好的办法,这就导致效率低下的问题 我们这里学习的意向共享和意向排他就是用来解决,由于需要而去挨个遍历数据,确定是否有某些数据被加了行,而导致的效率低下问题。...作用就是快速判断表里是否有记录被加锁 二、意向共享和意向排他(表而非行) 意向的作用:为了可以更快速的获取表 意向共享(IS):事务在给一行记录共享前,必须先取得该表的IS 意向排他...分析事务1获取行X事务2获取表S: 首先事务1需要给表的第10行数据X,于是InnoDB存储引擎自动给整张表加上了IX。...当事务2再想获取整张表的S时,看到这张表已经有别的事务获取了IX了,就说明这张表肯定有某些数据被加上了X,这就导致事务2不能给整张表S了。...与此同时,由于mysqld(MySQL Server守护进程)设置了事务阻塞的超时时间,事务不会阻塞很长时间,超时后事务处理失败,自动释放当前占有的 3.

    97840

    mysql事务 (三)

    目录 事务 事务特性ACID 事务带来的问题 事务隔离级别 Innodb类型 共享 Shared Locks 排它 Exclusive Locks 意向 (IS 、IX) 自增...**可重复读是mysql的默认事务隔离级别。**可就是说 Serializable(串行化) --解决所有问题 最高的隔离级别,通过强制事务的串行执行,避免了前面说的幻读问题。...Shared Locks 共享: 又称为读,简称S,顾名思义,共享就是多个事务对于同一数据可以共享一把,都能访问到数据,但是只能读不能修改; 加锁释方式: select * from users...name 锁住name为seven的数据 同时也在对应的主键索引加锁 两把 意向 (IS 、IX) 意向共享(Intention Shared Locks 简称IS):表示事务准备给数据行加入共享...,即一个数据行共享前必须先取得该表的IS, 意向共享之间是可以相互兼容的 意向排它(Intention Exclusive Locks 简称IX):表示事务准备给数据行加入排他,即一个数据行加排他前必须先取得该表的

    37610

    MySQL、行、排它共享

    专栏持续更新中:MySQL详解 事务隔离级别的实现原理:简单来说就是各种机制和MVCC多版本并发控制 我们学习知识的时候,需要了解知识点出现的原因,什么情况下能用到这个知识 我们说到事务,就得说到事务的...此时会放弃使用索引,因此也不会使用行,而是使用表,比如对一些很小的表,MySQL就不会去使用索引 三、排它(Exclusive)和共享(Shared) 排它,又称为X,写 共享,又称为...S,读 读读(SS)之间是可以兼容的,但是读写(SX)之间,写写(XX)之间是互斥的 对事务X和S之间有以下的关系: 一个事务对数据对象A加了 S ,可以对A进行读取操作但不能进行update...操作,加锁期间其它事务能对AS但不能 X 一个事务对数据对象A加了 X ,就可以对A进行读取和更新,加锁期间其它事务不能对A任何 显式加锁:select … lock in share...两个事务可以同时获取共享(SS共存) 现在让事务2插入数据 此时由于insert需要加排它,但由于事务1已经对整张表添加了共享事务2无法再对表成功加锁(SX不共存) rollback一下 因为我们给

    26440

    MySQL - 解读MySQL事务机制

    MySQL 是通过 WAL(Write Ahead Log)技术来实现这种效果的。 原子性和 WAL 到底有什么关系呢?...---- 隔离性 所谓隔离性,指的是一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对其他的并发事务是隔离的。和多版本控制就符合隔离性。...---- 并发事务控制 单版本控制- 用独占的方式来保证在只有一个版本的情况下事务之间相互隔离,所以可以理解为单版本控制。...在 MySQL 事务中,的实现与隔离级别有关系,在 RR(Repeatable Read)隔离级别下,MySQL 为了解决幻读的问题,以牺牲并行度为代价,通过 Gap 来防止数据的写入,而这种,因为其并行度不够...在 MySQL 中,任何 Buffer Pool 中的页被刷到磁盘之前,都会先写入到日志文件中,这样做有两方面的保证。

    76630

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

    当global时候,代表执行完之后其他所有session都可以使用当前设置的事务,如果是session则代表之后当前session才可以执行当前设置的事务,如果什么都没,则是默认下一条事务提交完毕,就恢复之前的事务...在使用加锁的方式解决问题时候,mysql设计了两个的分类: 共享:shared locks,简称s事务读取一条记录时候,必须先获取该记录的。...Insert: 一般来说,新插入的数据不需要加锁,mysql提供一种隐式来保护这条新数据在事务提交之前,不被其他事物来访问。...其实一个事务也可以在表级别进行加锁,自然称为表级或者表,对表加锁我们可以说这个的颗粒度比较粗,给表加锁分为共享和排它: 1、给表s: 如果一个事务给表s,那么, 别的事务可以继续获得该表的...这时候我们怎么知道整栋楼里有没有教室上锁呢,难道一次遍历,那太慢了,于是innoDB有个意向,Intention locks: 意向共享:intention shared locks,is,当事务给某行记录上

    64910

    mysql 事务操作与机制

    mysql 事务操作与机制 mysql 事务引入 mysql 事务具体的操作 mysql 的隔离级别 读未提交的脏读 读已提交引起的不可重复读 可重复读引起的幻读 串行化安全 引入 表级案例 读...写 行级案例 mysql 事务引入 mysql 事务是由存储引擎支持实现的,目前所主流的孙处引擎只有InnoDB支持mysql事务操作。...可以看到,之后,我们可以读取表,但是不可以修改。 然后我们再开启一个终端,进行同样的操作,发现我们也可以加锁,读,但是不能修改。注意这一点。 读都可以,说明了他是一种共享。...共享(S):又称为读,简称S共享就是多个事务对于同一数据可以共享一把,都能访问到数据,但是只能读不能修改。...排他(X):又称为写,简称X,排他就是不能与其他并存,如一个事务获取了一个数据行的排他,其他事务就不能再获取该行的其他,包括共享和排他,但是获取排他事务是可以对数据就行读取和修改。

    49120

    MySQL事务隔离级别和

    事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体。...(注:MySQL 通过机制来保证事务的隔离性)持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。...(注:MySQL 使用 redo log 来保证事务的持久性)事务的并发问题脏读:事务 A 读取了事务 B 更新的数据,然后 B 回滚操作,那么 A 读取到的数据是脏数据不可重复读:事务 A 多次读取同一数据...,事务 B 在事务 A 多次读取的过程中,对数据作了更新并提交,导致事务 A 多次读取同一数据时,结果不一致。...(Phantom Rows:幻影行)解决不可重复读的问题只需锁住满足条件的行(行),解决幻读需要表(表

    15200

    mysql事务的实践

    概念解释: 脏读 : 就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据 不可重复读 : 是指在一个事务内,多次读同一数据...在这个事务还没有结束时,另外一个事务也访问该同一数据,并且提交了修改。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。...1; 复制代码 Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 B窗口更新数据会因为A窗口的提示失败...内部其实已经解决了) GAP A窗口事务未提交 mysql> update class_teacher set class_name = 'ass' where teacher_id = 2; 复制代码...Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 B窗口事务 mysql> insert into

    40120

    mysql 事务知多少

    前言 文章内容输出来源:拉勾教育Java高薪训练营; mysql 事务特性、隔离级别,事务控制等等,我都在拉勾训练营学到啦,面试的时候再也不怕啦。...事务隔离级别 MySQL数据库是通过事务隔离级别来解决的,数据库系统提供了以下 4 种事务隔离级别供用户选择。...2、是数据库实现并发控制的基础,事务隔离性是采用来实现,对相应操作不同的,就可以防止其他事务同时对数据进行读写操作。...共享(行级-读共享又称为读,简称S共享就是多个事务对于同一数据可以共享一把,都能访问到数据,但是只能读不能修改。...乐观实现原理 使用版本字段(version) 先给数据表增加一个版本(version) 字段,每操作一次,将那条记录的版本号 1。

    71540

    MySQL事务隔离级别

    1、概述 (1)的定义 是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,除了传统的计算资源(如CPU、RAM、IO等)的争用以外,数据也是一种供需要用户共享的资源。...从对数据库操作的类型分为读和写(都属于悲观) 读共享):针对同一份数据,多个读操作可以同时进行而不会互相影响。...打开一个客户端B,并设置当前事务隔离级别为serializable,插入一条记录报错,表被了插入失败,MySQL事务隔离级别为serializable时会表,因此不会出现幻读的情况,但这种隔离级别并发性能极低...InnoDB的行是针对索引,不是针对记录。并且该索引不能失效,否则都会从行升级为表。...大多数情况MySQL可以自动检查死锁并回滚产生死锁的那个事务,但是有些情况MySQL无法自动检测死锁。

    63020

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

    并且,读取之后,还需要保证其他并发事务不能修改当前记录,对读取记录加锁。其中,除了第一条语句,对读取记录S (共享)外,其他的操作,都的是X (排它)。...若事务T对数据对象A加上X事务T可以读A也可以修改A,其他事务不能再对A任何,直到T释放A上的。 对于共享大家可能很好理解,就是多个事务只能读数据不能改数据。...update语句,共享可以使用select … lock in share mode语句。...意向共享(IS):事务打算给数据行共享事务在给一个数据行共享前必须先取得该表的IS。 意向排他(IX):事务打算给数据行加排他事务在给一个数据行加排他前必须先取得该表的IX。...事务可以通过以下语句显式给记录集共享或排他共享(S):mysql SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。

    2.4K30
    领券