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

MySQL加锁范围分析

场景: 最近,遇到了一个关于mysql 加锁的问题,将当时的情形简化如下,有一个index_test表,表结构如下所示: mysql> CREATE TABLE `index_test` ( `priv_id...不可重复读(Non-repeatable read):当一行数据获取两遍得到不同的结果表示发生了“不可重复读(non-repeatable read) 幻读(Phantom Read):当两个完全相同的查询语句执行得到不同的结果集...然后在网上搜索相关的资料,看看别人有没有遇到过这样的问题,在一篇关于MySQL加锁处理分析的blog中得到了启示,按照blog中组合七:id非唯一索引+RR的理论,gap锁的范围不仅跟被锁定的键有关,还跟主键有关...因此,在我们使用mysql加锁过程中,也首先需要搞清楚,我们的隔离级别是什么,是否开启了binlog等等,然后才能正确分析加锁的范围。...p=771 大神描述Mysql 加锁分析的blog http://hedengcheng.com/?

6.1K72
您找到你想要的搜索结果了吗?
是的
没有找到

mysql语句加锁分析

其实并不能完全解决幻读问题, 这里可以参考另一篇博客[mysql事务隔离级别与加锁分析] SERIALIZABLE隔离级别下,需要分为两种情况讨论: 在系统变量autocommit=0时,也就是禁用自动提交时..., 在加锁情况下脏读和不可重复读在任何一个隔离级别下都不会发生(因为读-写操作需要排队进行) 主键查询情况 等值查询 SELECT ......这里还是分是否有更新二级索引的情况,如果更新就只往符合条件的聚簇索引加锁 使用DELETE ...来为记录加锁, 与UPDATE一样 二级索引 等值查询 SELECT ......,就要对查询记录与下一条记录之间加个间隙锁,值得注意的是,这里只需要对二级索引加锁就好了,不需要还另外对主键索引加锁 使用SELECT ......] [公众号:我们都是小青蛙 - MySQL加锁分析三部曲]

86030

MySQL加锁实战分析

ENGINE=InnoDB; insert into t values(0,0,0),(5,5,5), (10,10,10),(15,15,15),(20,20,20),(25,25,25); MySQL...加锁的基本单位是next-key lock(前开后闭区间) 查找过程中访问到的对象才会加锁 索引上的等值查询,给唯一索引加锁的时候,next-key lock退化为行锁 索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候...lock,Session A的加锁范围是(5, 10] 根据规则4,SessionA是等值查询,而id=10不满足等值条件,因此next-key lock退化为间隙锁,最终的加锁范围变为(5, 10)...next-key lock,因此加锁范围是(0, 5] 索引c是普通索引,根据规则4,最终会退化成间隙锁(5, 10) 根据规则2,只有访问到的对象才会加锁,由于Session A的查询使用覆盖索引,并不需要访问主键索引...注意我们这里加的是读锁,如果你使用的是for update,MySQL会认为你要更新数据,因此会给主键索引上满足条件的行加上行锁。

1K30

MySQL 加锁处理分析

MVCC最大的好处,相信也是耳熟能详:读不加锁,读写冲突。...区别快照读与当前读,所有的读操作均为当前读,读加读锁 (S锁),写加写锁 (X锁)。 Serializable隔离级别下,读写冲突,因此并发度急剧下降,在MySQL/InnoDB下不建议使用。...与组合二唯一的区别在于,组合二最多只有一个满足等值查询的记录,而组合三会将所有满足查询条件的记录都加锁。 结论:若id列上有非唯一索引,那么对应的所有满足SQL查询条件的记录,都会被加锁。...semi-consistent read开启的情况下,对于不满足查询条件的记录,MySQL会提前放锁。...当然,也可以通过触发semi-consistent read,来缓解加锁开销与并发影响,但是semi-consistent read本身也会带来其他问题,建议使用。

3.5K61

MySQL InnoDB 加锁机制

MVCC是指,InnoDB使用基于时间点的快照来获取查询结果,读取时在访问的表上设置任何锁,因此,在事务T1读取的同一时刻,事务T2可以自由的修改事务T1所读取的数据。...所以当事务回滚时, 自增id会出现连续记录....且由于MySQL会对锁的粒度做一定优化, 所以应以实际加锁为准. 1....对应上面的sql, 查询从满足条件的第一条记录开始, 即17开始加锁; 判断当前节点满足查询条件, 继续扫描; 然后又遇到了42, 继续加锁, 判断当前节点已经不满足条件了, 所以扫描到此为止....11.使用聚簇联合索引的等值查询 加锁与非聚簇联合唯一索引一致 12.使用聚簇联合索引的范围查询 与非聚簇唯一索引范围查询加锁有一点不同, 那就是主键的范围查询不会进行多余加锁 13.混合使用多个索引的查询

2.9K00

MySQL语句加锁分析详解

当然,有时候因为MySQL具体的实现而导致一些情景下的加锁有些不太好理解,这就得我们死记硬背了~ 我们这里把语句分为3种大类:普通的SELECT语句、锁定读的语句、INSERT语句,我们分别看一下。...不过这里有一个小插曲: # 事务T1,REPEATABLE READ隔离级别下 mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> SELECT...我们说语句一和语句二是MySQL中规定的两种锁定读的语法格式,而语句三和语句四由于在执行过程需要首先定位到被改动的记录并给记录加锁,也可以被认为是一种锁定读。...小贴士:上述步骤是在MySQL 5.7.21这个版本中验证的,不保证其他版本有无出入。...这个问题我也没想明白,人家就是这么规定的,如果有明白的小伙伴可以加我微信 xiaohaizi4919 来讨论一下哈~ 再强调一下,我使用的MySQL版本是5.7.21,不保证其他版本中的加锁情景是否完全一致

1.3K40

MySQL更新语句加锁

其中MVCC最大的好处是:读不加锁,读写冲突。在读多写少的OLTP应用中,读写冲突是非常重要的,极大的提高了系统的并发性能,在现阶段,几乎所有的RDBMS,都支持MVCC。...Repeatable Read(RR):针对当前读,RR隔离级别保证对读取到的记录加锁(记录锁),同时保证对读取的范围加锁,新的满足查询条件的记录不能够插入(间隙锁),不存在幻读现象。...区别快照读和当前读,所有的读操作都是当前读,读加读锁(S锁),写加写锁(X锁)。在该隔离级别下,读写冲突,因此并发性能急剧下降,在MySQL/InnoDB中建议使用。...组合三、id唯一索引+RC 该组合中,id列不在唯一,而是个普通索引,那么当执行sql语句时,MySQL又是如何加锁呢?...当然在MySQL中,可以触发 semi-consistent read来缓解锁开销与并发影响,但是semi-consistent read本身也会带来其他的问题,建议使用。

2.1K20

MySQL 加锁和死锁解析

查询过程,类似于Select/Delete) Step 2:删除当前定位到的记录(标记为删除状态) Step 3:拼装更新后项,根据更新后项定位到 新的插入位置 Step 4:在新的插入位置,判断是否存在...Unique 冲突( 存在Unique Key 时) Step 5:插入更新后项(不存在Unique冲突时) Step 6: 重复Step 1 到Step 5 的操作,直至扫描完整个查询范围 Update...有Unique key: 查找满足条件的记录:查询范围内的所有记录, LOCK_X + LOCK_REC_NOT_GAP 更新后项存在唯一性冲突:冲突项上的加锁,LOCK_S + LOCK_ORDINARY...+ row based binlog,基本上能够解决所有问题,无需使用Repeatable Read) 适当的 减少Unique 索引,能够减少GAP锁导致的死锁(根据业务情况而定) • 原则之三 在MySQL...,如果死锁中出现Next Key(Gap锁),说明表中一定存在unique索引 多语句事务产生的死锁,确保每条语句操作记录的顺序性,能够极大减少死锁 本文大多数都整理自《死锁-何登成 - 管中窥豹——MySQL

96420

mysql 模糊查询实现区分大小写

需求说明: 有时候,我们需要从数据库中模糊查询,但是字母有大写也有小写。 1:在执行查询的时候,需要忽略大小写。 2:以输入字母开头进行查询的 创建表: ? 请点击此处输入图片描述 ?...请点击此处输入图片描述 假设用户现在要查询name是D或者d开头的数据怎么? 解决需求一,忽略大小写的。可以先查询大写,在查询小写。然后union 下 先查询出所有小写字母d开头的: ?...在查询出所有大写字母D开头的 ? 请点击此处输入图片描述 ? 使用union 进行连接。 ? 请点击此处输入图片描述 ? 当然这样也可以得到最终的结果。但是这样执行从效率上来说很不好。...解决需求二:以输入字母开头进行模糊查询 在上面语句中我们可以看到使用的是‘d%’或者是'D%'这样看上去好像有点不是很好。...综上要想解决并优化实现查询 D或者d开头的可以使用到以下三个函数: 函数一:upper(keyword )。大写函数 函数二:lower(keyword )。

5K20

MySQL】深入分析 锁机制(一)行锁 加锁规则 之 等值查询

文章目录 前言 一、共享锁(S)和排它锁(X) 二、行锁的3种算法 Record Lock Gap Lock Next-key Lock 三、加锁规则 之 等值查询 分析数据准备 3.1 聚集索引 有匹配索引...对于行锁,行锁的S/X模式和3种算法是最基础的,然后再深入分析行锁的加锁规则等等几篇,本文主要深入分析行锁的加锁规则中的等值查询。...---- 三、加锁规则 之 等值查询 明白了3种算法,那么这3种算法又是怎么落地的呢? 实际上,默认使用的是Next-key Lock,也就是 索引记录 和 间隙 全锁上。...之 等值查询。...我们来分析一下: 行锁都是对索引记录加锁(除了伪值上界限supremun),因为id=11的索引不存在,所以无法对id=11加锁

93130

MySql查询区分大小写解决方案

背景 当我们输入不管大小写都能查询到数据,例如:输入 lingyejun 或者Lingyejun ,LingYeJun都能查询同样的结果,说明查询条件对大小写不敏感。...'; SELECT * FROM TABLE NAME WHERE name='Lingyejun'; 办法 解决方案一: 于是怀疑Mysql的问题。...一般而言我们设置字符集注意以下两种: utf8_general_ci --区分大小写 utf8_bin--区分大小写 当字符设置为区分大小写时的解决办法: 1.可以将查询条件用binary()括起来...查询默认是区分大小写的 如: select * from some_table where str=‘lingyejun'; select * from some_table where str='LINGYEJUN...'; 得到的结果是一样的,如果我们需要进行区分的话可以按照如下方法来做: 第一种方法: 要让mysql查询区分大小写,可以: select * from some_table where binary

1.9K20

为什么MySQL推荐使用子查询和join

来源:cnblogs.com/liboware/p/12740901.html 1.对于mysql推荐使用子查询和join是因为本身join的效率就是硬伤,一旦数据量很大效率就很难保证,强烈推荐分别根据索引单表取数据...查询id集的时候,使用IN()代替关联查询,可以让MySQL按照ID顺序进行查询,这可能比随机的关联要更高效。 可以减少冗余记录的查询。...三、推荐使用join的原因 1.DB承担的业务压力大,能减少负担就减少。...这种时候是建议跨库join的。目前mysql的分布式中间件,跨库join表现不良。...四、不使用join的解决方案 在业务层,单表查询出数据后,作为条件给下一个单表查询。也就是子查询。会担心子查询出来的结果集太多。mysql对in的数量没有限制,但是mysql限制整条sql语句的大小。

3.8K30

MySQL谬误集01:读不加锁

MySQL5.5引入了metadata lock,对所有查询都会加表锁(包括非事务引擘)。...在读多写少的OLTP应用中,读写冲突大幅增加了系统的并发性能,所以当前几乎所有的RDBMS,都支持了MVCC。 MVCC是如何实现的?...Serializable隔离级别 注意上面引文中的最后一句话,MVCC与Serializable隔离级别兼容,Serializable下会对所有读取的行加锁,读不加锁不再成立!...Serializable隔离级别下,查询informaction_schema看下blocking的情况: SELECT r.trx_id waiting_trx_id, r.trx_mysql_thread_id...总结 MySQL读不加锁是有条件的: 所有读取都会加Metadata Lock MyISAM引擘会加表锁 INNODB引擘读不加锁是利用MVCC实现的 Serializable隔离级别会对所有读取的行加锁

34132

Access匹配查询

大家好上节介绍了重复项查询,继续介绍选择查询中的匹配项查询匹配查询也是在查询向导中创建。...一、 匹 配 查 询 匹配查询:将数据表中不符合查询条件的数据显示出来,其作用于隐藏符合条件的数据的功能相似。(在使用时需要注意匹配数据的两张表的先后顺序。)...(如果有人漏发了工资,就可以通过匹配查询查找出匹配的记录。)...库存图书中没有但可以通过匹配查询来找出,匹配的项。创建匹配查询向导如下图所示: 匹配数据时使用的出版商号,在向导中都有提示文字。 首先选择的是,数据是完整的表,即出版商表。...---- 今天下雨 本节主要介绍选择查询中的匹配查询,需要注意使用时的设置表的顺序,确定需要查什么数据,先设置数据完整的表,再选可能不完整的表。至此选择查询的部分都介绍完毕,祝大家学习快乐。

1.9K10

MySQL死锁系列-常见加锁场景分析

在上一篇文章《锁的类型以及加锁原理》主要总结了 MySQL 锁的类型和模式以及基本的加锁原理,今天我们就从原理走向实战,分析常见 SQL 语句的加锁场景。...隔离等级对加锁的影响 MySQL 的隔离等级对加锁有影响,所以在分析具体加锁场景时,首先要确定当前的隔离等级。...序列化(Serializable):从 MVCC 并发控制退化到基于锁的并发控制,不存在快照读,都是当前读,并发效率急剧下降,建议使用。...聚簇索引,查询命中 聚簇索引就是 InnoDB 存储引擎下的主键索引,具体可参考《MySQL索引》。...我们需要使用 MySQL 相关的工具进行分析,并且有时甚至需要查询 MySQL 相关的日志信息来了解到底语句加了什么锁或者为什么产生死锁,下篇文章中我们就主要了解一下这些内容,请大家持续关注。

1.7K00

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券