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

mysql读数据会加行级锁

基础概念

MySQL中的行级锁是一种锁定机制,用于在并发访问数据库时控制对数据行的访问。行级锁可以确保在同一时间只有一个事务能够修改特定的数据行,从而避免数据不一致和并发问题。

优势

  1. 高并发性:行级锁允许多个事务同时读取和修改不同的数据行,提高了数据库的并发性能。
  2. 细粒度控制:相比于表级锁,行级锁提供了更细粒度的锁定控制,减少了锁冲突的可能性。
  3. 数据一致性:通过锁定特定的数据行,行级锁确保了数据的一致性和完整性。

类型

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

  1. 共享锁(Shared Locks):允许多个事务同时读取同一数据行,但阻止其他事务对该数据行进行修改。
  2. 排他锁(Exclusive Locks):阻止其他事务读取或修改被锁定的数据行,只有持有排他锁的事务才能对该数据行进行修改。

应用场景

行级锁适用于以下场景:

  1. 高并发读写操作:在需要频繁读取和修改数据的场景中,行级锁可以提高并发性能。
  2. 事务隔离级别:在使用较高的事务隔离级别(如可重复读或串行化)时,行级锁可以确保数据的一致性和完整性。
  3. 复杂查询:在执行涉及多个表的复杂查询时,行级锁可以减少锁冲突,提高查询性能。

遇到的问题及解决方法

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

原因:死锁通常发生在两个或多个事务互相等待对方释放锁的情况下。例如,事务A持有数据行X的排他锁并请求数据行Y的排他锁,而事务B持有数据行Y的排他锁并请求数据行X的排他锁,这样就会形成死锁。

解决方法

  1. 设置超时时间:通过设置innodb_lock_wait_timeout参数,当事务等待锁的时间超过该值时,MySQL会自动回滚其中一个事务以解除死锁。
  2. 优化事务逻辑:尽量减少事务的持有时间,避免长时间持有锁。
  3. 按顺序加锁:确保所有事务按照相同的顺序请求锁,这样可以减少死锁的可能性。

问题:为什么读取数据会加行级锁?

原因:在某些情况下,即使只是读取数据,MySQL也会加行级锁以确保数据的一致性。例如,在使用SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODE语句时,MySQL会分别加排他锁和共享锁。

解决方法

  1. 优化查询语句:尽量避免使用SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODE,特别是在高并发场景下。
  2. 使用快照读:在某些存储引擎(如InnoDB)中,可以使用快照读(Snapshot Read)来避免加锁。例如,使用SELECT * FROM table WHERE ...语句时,InnoDB会使用多版本并发控制(MVCC)来实现快照读。
  3. 调整事务隔离级别:根据具体需求,适当降低事务隔离级别,以减少锁的使用。

示例代码

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

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

-- 加排他锁
SELECT * FROM table WHERE id = 1 FOR UPDATE;

-- 执行修改操作
UPDATE table SET column = 'value' WHERE id = 1;

-- 提交事务
COMMIT;

参考链接

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

相关·内容

MySQL如何加行或者表

MySQL中对表进行加锁,主要有两种模式:共享和排他 共享(S Lock),多个事务可以同时获取共享,但是只能进行操作,不能进行修改操作 排他(X Lock),获得排他的事务可以进行修改操作...行可以减少并发冲突,提高数据库的并发性能,常见的行也有两种 共享(S Lock):多个事务可以同时获得共享,但是不能进行修改操作,只能进行操作。...排他(X Lock):获得排他的事务可以对行进行修改操作, 其他事务无法进行读写操作。 然后,怎么对数据加行?...先介绍一下怎么加行的排他,学习数据库的时候,有时候会使用for update,是的,使用命令 # 对id为1的数据加行排他 SELECT * FROM t1 WHERE id=1 FOR UPDATE...# 对ID为1的数据加行的共享 SELECT * FROM t1 WHERE id = 1 LOCK IN SHARE MODE;

1.6K20

⑩⑦【MySQL:全局、表、行

的分类: MySQL中的,按照的粒度分,可分为下述三类: ①全局:锁定数据库中所有的表。 ②表:每次操作锁住整张表。 ③行:每次操作锁住对应的行数据。 2....设置全局: FLUSH TABLES WITH READ LOCK; MySQL数据备份: # MySQL数据库备份的 (命令行指令) mysqldump -uroot -p密码 备份数据库名>保存备份的文件名...表分类: ①表 :表共享(read lock) / 表独享写(write lock) -- 设置表 -- 设置了read lock,当前客户端和其他客户端都只能读不能写。...写即阻塞其他客户端的操作又阻塞其他客户端的写操作 元数据 ②元数据(meta data lock,MDL) : ⚪MDL加锁过程是系统自动控制 ,无需显式使用,在访问一张表的时候自动加上。...⚪在MySQL5.5中引入了MDL,当对一张表进行增删改查的时候,加MDL(共享) ;当对表结构进行变更操作的时候,加MDL写(排他) 。

39130
  • Mysql

    是计算机协调多个进程或纯线程并发访问某一资源的机制. 在mysql中更是用处多多, 今天就一起看下mysql中的行. 它主要包括行, 间隙, 临键三种....间隙(gap lock) 间隙是innodb在可重复读提交(RR)事务级别下为了解决幻问题时引入的机制,它锁定一段范围内的索引记录,而不仅仅是这个区间中的每一条数据. 2....一般唯一索引列或主键索引在进行精准匹配(=)时, 会使用记录; 其他( >, <, like)等条件退化成临键. 4....查看信息, 是数据(30,30)被X,GAP两种锁住, 同时影响到了数据区间(20,30). insert into tab value(21,21,21); 信息 mysql> SELECT...INNODB_LOCKS表 mysql提供的查看信息的元数据表.

    3.3K20

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

    粒度大,发生冲突概率大,并发效率低。 适合查询。 行: row-level loking,锁住一行记录。 开销大,加锁慢。 死锁。 粒度小,发生所冲突概率小,并发效率高。...并不是直接丢记录行加锁,而是对行对应的索引加锁: 如果sql 语句操作了主键索引,Mysql 就会锁定这条主键索引。...如果sql语句操作了非主键索引,MySQL先锁定该非主键索引,再锁定相关的主键索引。 在InnoDB中,如果SQL语句不涉及索引,则会通过隐藏的聚簇索引来对记录加锁。...InnoDB引擎支持表和行,默认为行。 共享与排他 共享: 有称之为S。...悲观: 悲观:悲观地认为,并发问题极易发生。 悲观认为并发问题极易发生,所以每次操作,无论读写,都会对记录加锁,以防止其他线程对数据进行修改。 实现方式:数据库的行和写

    1K20

    MySQL与行

    MySQL分为和写。...LOW_PRIORITY是一种比更低优先,当多个线程同时申请多种(LOW_PRIORITY,READ,WRITE)时,LOW_PRIORITY的优先最低。...申请成功的前提是没有线程对表加和其他写,否则会被阻塞。 表锁在MyISAM和innoDB中都有用到,创建的开销小,不会出现死锁,由于锁定的是整张表,所以并发度低。...当需要频繁对大部分数据做 GROUP BY 操作或者需要频繁扫描整个表时,推荐使用表。 行Mysql中锁定粒度最细的一种,能大大减少数据库操作的冲突,由于其粒度小,加锁的开销最大。...其他线程也可以读取使用了共享的表,而且这些线程读取的是同一个版本的数据

    2.3K20

    MySQL间隙(幻解决原理)

    专栏持续更新中:MySQL详解 一、间隙概念 当我们用范围条件而不是相等条件检索数据, 并请求共享或排他时,InnoDB 会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录...回滚,重新开启事务 开始测试 我们发现事务1无论是插入age>18范围内的数据,还是范围外的数据,都无法成功 这时我们就要分析了,这应该没有用到索引,因为我们用索引,过滤出的数据占了整张表的一大半,MySQL...没有加行,只能加表(这时加的是共享),所以事务1无论插入什么数据都不行 果然,没有用到索引 age>20用到了索引,所以可以用行 三、测试等值间隙 查看表结构和表数据 设置成手动提交,设置串行化隔离级别...=10)和(age=18,id=8)是会发生幻的,所以在一切影响select * from user where age=18查询结果的地方都加上了间隙,但这也导致一些本不影响查询结果的语句也执行失败...和gap-lock(防止别的事务插入索引值重复的数据,造成幻) 对于主键索引,或者唯一键索引,值不允许重复,那只需要加行就够了,不需要再加间隙(对于唯一键索引,不可能发生插入索引值重复的数据) 串行化隔离级别通过排它和共享解决脏

    1.1K20

    深入理解MySQL中事务隔离级别的实现原理

    未提交(RU) 事务对当前被读取的数据不加锁; 事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加行共享,直到事务结束才释放。...提交(RC) 事务对当前被读取的数据加行共享(当读到时才加锁),一旦读完该行,立即释放该行共享; 事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加行排他,直到事务结束才释放。...可重复读(RR) 事务在读取某数据的瞬间(就是开始读取的瞬间),必须先对其加行共享,直到事务结束才释放; 事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加行排他,直到事务结束才释放。...通过快照,在这个级别MySQL就解决了不可重复读的问题 可重复读(RR) 事务对当前被读取的数据不加锁,且是快照读; 事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加行排他(Record,...通过间隙,在这个级别MySQL就解决了幻的问题 序列化(S) 事务在读取数据时,必须先对其加表共享 ,直到事务结束才释放,都是当前; 事务在更新数据时,必须先对其加表排他 ,直到事务结束才释放

    4.3K333263

    MySQL 机制(上) -- 全局与表

    按照锁定范围分 按照锁定范围,mysql可以分为: 全局 — 锁定整个 mysql 的全局执行 表 — 锁定单个表 行 — 锁定单条或多条行记录 行又可以进一步细分为: 记录 —...”。...当当前连接断开时,全局自动解锁。 4.2. 使用场景 — 全部备份 全局最常用的使用场景是全库备份,假设没有全局,我们要备份一个账户数据库。...表 MySQL 中有两种表: 表数据 — MDL(meta data lock) 5.1....后记 本文介绍了 MySQL 的全局、表以及各种的基本实现,但事实上,在 innodb 引擎中,我们最为常用的是行。 行也是所有的中相对最为复杂的,敬请期待我们下一篇文章的讲解。

    2.1K10

    MySQL Cases-MySQL找出谁持有全局

    /developer/article/1869793 MySQL找出谁持有行(RC级别)https://cloud.tencent.com/developer/article/1869900 找出谁持有全局...另外还有一种情况,可是最难排查的一种情况,就是线上系统权限约束不规范,各种人员使用的数据库账号都有RELOAD权限,都可以对数据库加全局。     ...在MySQL5.7之前的版本中,要排查谁持有全局,通常在数据库层面是很难直接查询到有用数据的(innodb_locks表也只能记录InnoDB层面的信息,而全局是Server层面的,所以无法查询到...从MySQL5.7版本开始提供了performance_schema.metadata_locks表,用来记录一些Server层的信息(包含全局和MDL等)。...,包括全局和MDL等信息 mysql> select * from performance_schema.metadata_locks where owner_thread_id !

    1.1K61

    MySQL】一文带你理清<表>(表,元数据,意向

    前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎!...本章主要内容面向接触过C++ Linux的老铁 主要内容含: 一.表的基本概念&分类【表,元数据,意向】 表,每次操作锁住整张表。...对于表,主要分为以下三类: 表数据 意向 【1】表 对于表,分为两类: 表共享 (read lock) 表独占写 (write lock) 语法: 加锁: locktables...MDL主要作用是维护表元数据数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作 在MySOL5.5中引入了MDL,当对一张表进行增删改查的时候,加MDL(共享);当对表结构进行变更操作的时候...不同SQL对应的元数据有所不同: 【3】意向 1.意向的由来 意向出现的场景: 线程A:有一张表和客户端,我们开启事务,更新id为3的数据自动加上 行 此时,我们想给这张表上

    13710

    MySQL必懂系列》全局、表、行

    MySQL提供了不同等级的,按限制能力的划分,分为全局、表、行。本文描述不同的应用场景与实现原理。...在执行这个命令之后,MySQL进入全局的状态,整个数据拒绝掉增删改这些请求。 为什么需要全局 全局的目标是为我们维护一个数据库的逻辑一致性。...MySQL官方自带的逻辑备份工具mysqldump,在备份数据之前,启动一个事务,以此来获得一个逻辑一致性视图。...客户端(相对于MySQL)发生异常,FTWRL命令下自动释放MySQL的全局。而readonly一直停留在readonly状态,数据库长期处于不可写状态。...表也分为两类: 表 、 元数据(meta data lock,MDL)。 业务的更新不只是增删改数据(DML),还有可能是加字段等修改表结构的操作(DDL)。

    1.4K20

    美团一面:能不能通俗的解释下为什么要有意向这个东西?

    MySQL 自身就提供了表的能力: :LOCK TABLE table_name READ 用表,阻塞其他事务的写操作 写:LOCK TABLE table_name WRITE 用写表...,阻塞其他事务的和写操作 行是 InnoDB 存储引擎提供的,MySQL 本身并不提供行的能力: ,如 SELECT * FROM table_name WHERE ......LOCK IN SHARE MODE 加行阻塞其他事务对该行记录的写操作 写,如 SELECT * FROM table_name WHERE ......FOR UPDATE 加行阻塞其他事务对该行记录的的和写操作 又有表又有行,我们来考虑下这两种类型的共存的问题。...(行)时,InnoDB 存储引擎自动地先获取该表的意向写(表) 注意这里的自动:申请意向的动作是数据库完成的,就是说,事务 A 申请一行的行的时候,数据自动先开始申请表的意向,不需要我们程序员使用代码来申请

    72320

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

    前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎!...其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性 逻辑备份前加上 全局 逻辑备份后,解锁 三.行的基本概念&分类(行 = 临键-见隙...) 行,每次操作锁住对应的行数据。...,对应的是所著3和7之间的间隙 向右遍历时最后一个值不满足查询需求时, 临键 退化为间隙 (可理解成多出一个间隙) 四.表的基本概念&分类【表,元数据,意向】 表...对于表,主要分为以下三类: 表数据 意向 【1】表 对于表,分为两类: 表共享 (read lock) 表独占写 (write lock) 语法: 加锁: locktables

    11710

    小白学习MySQL - 查询表?

    我们知道,Oracle中除了使用select ... for update,其他查询语句不会出现,即没有一致性通过多版本解决的,可以保证在不加锁的情况下读到正确的数据。...,有五个record lock,虽然我只从test_1读取一行数据,但实际上对test_1的所有记录都加了,而且显式对test_1加了一个IS的意向,因此这种操作,确实影响了select表的并发执行...解决方案2:更改隔离级别 在创建索引前,之所以会出现表的情况,和隔离级别是相关的,首先看下数据库的隔离级别。...,即多个快照数据,避免对读加锁,提高的并发。...test_2上是没有任何,因此不会出现RR锁定test_2的情况, mysql> show engine innodb status \G; ... ------------ TRANSACTIONS

    2.3K30

    三分钟入门 InnoDB 存储引擎中的表和行

    与行 所谓 “表 (Table Lock)”,就是锁定整张表,它是 MySQL 中最基本的策略,并不依赖于存储引擎,就是说不管你是 MySQL 的什么存储引擎,对于表的策略都是一样的,并且表是开销最小的策略.../ :允许事务(select)数据 排他 / 写:允许事务删除(delete)或更新(update)数据 是共享的,或者说是相互不阻塞的。...再来看第二个问题,有了意向之后,事务 T1 在申请行之前,MySQL 先自动给事务 T1 申请这张表的意向排他,当表上有意向排他时其他事务申请表会被阻塞,也即事务 T2 申请这张表的写就会失败...(lock table user read(write)) lock table user read; # 加表 unlock tables; # 释放表 如何加行: 1)对于常见的 DML...LOCK IN SHARE MODE,加行 另外,需要注意的是,InnoDB 存储引擎的行是基于索引的(这个下篇文章详细解释),也就是说当索引失效或者说根本没有用索引的时候,行就会升级成表

    3.6K20

    数据库篇:mysql详解

    共享只用于锁定,如需要更新数据,是不允许的 2 表 针对数据库表的,又称为表 开销小,加锁快;不会出现死锁;锁定粒度大,发生冲突的概率最高,并发度最低 MySQL有两种模式:表共享(Table...属性,之后插入数据时可以不指定该字段,系统自动为它赋值,此时获取自增值是需要 AUTO_INC 锁定的 3 行 Record Lock innodb 既支持表也支持行,行是针对一行记录的...4 间隙 Gap Lock mysql 在 repeatable read 隔离级别解决幻的,有两种实现方式。...它既能保护该记录,又能阻止别的事务将新的记录插入被保护记录的前面间隙中 6 加锁场景(repeatable read 隔离级别加锁 sql,忽略二索引的加锁操作) 快照读:的是数据库记录的快照版本,...聚簇索引上加 X ,当前 select lock in share mode 聚簇索引上加行 S ,采用当前 insert、update 和 delete 语句的加锁情况 insert 在可重复读级别加的是

    1.3K10

    mysqlmysql事务(四)

    这就是幻 隔离级别 隔离级别越高,效率越低 *未提交(Read uncommited)RU 事务对当前被读取的数据不加锁; 事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加行共享,直到事务结束才释放...*提交(Read commited)RC 事务对当前被读取的数据加行共享(当读到时才加锁),一旦读完该行,立即释放该行共享; *事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加行排他...可重复读 (Repeatable read)RR 事务在读取某数据的瞬间(就是开始读取的瞬间),必须先对其加行共享,直到事务结束才释放; 事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加行排他...事务在读取数据时,必须先对其加表共享 ,直到事务结束才释放; 事务在更新数据时,必须先对其加表排他 ,直到事务结束才释放。...为了解决这个问题,MySQL采用了RR这种隔离级别,因为在RR中,会在更新数据的时候增加记录的同时增加间隙,可以避免事务乱序的情况发生。 为啥大厂都换为RC?

    24730

    MySQL锁相关总结|悲观、乐观、写、表、行、页面、间隙、临键

    乐观 乐观对于数据库的数据的读写持乐观态度,即在整个数据处理的过程中,他很乐观的认为数据保持一致性,所以不加锁,而是通过数据版本记录机制实现。... 读写又称为共享或者S(Shared Lock),针对同一份数据,可以加多个而互不影响。 4....写又称为排他或者X(Exclusive Lock),如果当前写未释放,他阻塞其他的写。 5. 表也称为表,就是在整个数据表上对数据进行加锁和释放。...页面锁定是 MySQL 中比较独特的一种锁定级别。特点:锁定颗粒度介于行锁定与表之间,开销和加锁时间界于表和行之间,并发处理能力也同样是介于上面二者之间,并发度一般。...通过临建可以解决幻的问题。 每个数据行上的非唯一索引列上都会存在一把临键,当某个事务持有该数据行的临键时,锁住一段左开右闭区间的数据

    17910

    MySQLMySQL(三)元数据与间隙

    MySQL(三)元数据与间隙 在上篇文章中,我们就提到过 元数据 和 间隙 这两个名词,不知道有没有吊起大家的胃口。这俩货又是干嘛的呢?别急,我们一个一个来看。...其实在默认情况下,行 就是 临键 ,它会自己以及附近的数据,但是,如果是主键或者唯一索引,退化成 记录 ,也就是我们习惯说的那个 “行” ,而在大部分情况下,普通的间隙空值操作也退化为 间隙...间隙 和 临键 都是为了解决一个问题,那就是 幻 的问题。...因此,后面我们插入一条 id 为 45 的数据阻塞。 因此,在 更新/删除 数据时,如果是范围条件,即使有索引,也很多间隙,特别是 id 或数据不连续(普通索引)的情况下。...插入数据的情况稍微好一点,毕竟我们更习惯于自增主键的形式插入,但也要注意 自增 的情况,这个我们下回再说。 总结 是不是感觉 间隙 非常复杂?

    18310
    领券