首页 » 网站建设 » phpsql加锁技巧_闲谈常见SQL语句加锁

phpsql加锁技巧_闲谈常见SQL语句加锁

访客 2024-12-01 0

扫一扫用手机浏览

文章目录 [+]

表锁:表级读锁,表级写锁,读意向锁,写意向锁,自增锁

行锁:读记录锁,写记录锁,间隙锁,Next-key 锁,插入意向锁。

phpsql加锁技巧_闲谈常见SQL语句加锁

这些锁一旦冲突就会导致去世锁问题的产生。

phpsql加锁技巧_闲谈常见SQL语句加锁
(图片来自网络侵删)
S锁和X锁S锁:共享锁,加了S锁的记录,许可其他事务再加S锁,不许可其他事务再加X锁X锁:排他锁,加了X锁的记录,不许可其他事务再加S锁或者X锁意向锁

意向锁的存在是为了折衷行锁和表锁的关系,表明某个事务持有了锁、或准备去持有锁,支持多粒度(表锁与行锁)的锁并存。

意向共享锁(IS锁):事务在要求S锁前,要先得到IS锁意向排他锁(IX锁):事务在要求X锁前,要先得到IX锁表锁表锁(分 S 锁和 X 锁)意向锁(分 IS 锁和 IX 锁)自增锁(一样平常见不到,只有在 innodb_autoinc_lock_mode = 0 或者 Bulk inserts 时才可能有)行锁

行锁都是加在索引上的,终极都会落在聚簇索引上,加行锁的过程是一条一条记录加的。

记录锁(分 S 锁和 X 锁)间隙锁(分 S 锁和 X 锁)Next-key 锁(分 S 锁和 X 锁)插入意向锁锁冲突S 锁和 S 锁兼容,X 锁和 X 锁冲突,X 锁和 S 锁冲突表锁和行锁的冲突矩阵GAP锁

间隙锁本色上是对索引前后的间隙上锁,不对索引本身上锁。

根据检索条件向左探求最靠近检索条件的记录值A,作为左区间,向右探求最靠近检索条件的记录值B作为右区间,即锁定的间隙为(A,B)。
间隙锁的目的是为了防止幻读,防止间隙内有新数据被插入,防止已存在的数据,更新成间隙内的数。

sql加锁的规则select加锁规则SELECT ... 语句正常情形下为快照读,不加锁。
SELECT ... LOCK IN SHARE MODE 语句为当前读,加 S 锁。
SELECT ... FOR UPDATE 语句为当前读,加 X 锁。
常见的 DML 语句(如 INSERT、DELETE、UPDATE)为当前读,加 X 锁。
常见的 DDL 语句(如 ALTER、CREATE 等)加表级锁,且这些语句为隐式提交,不能回滚。
不同隔离级别下的锁 SELECT ... 语句正常情形下为快照读,不加锁;但是在 Serializable 隔离级别下为当前读,加 S 锁RC 隔离级别下没有间隙锁和 Next-key 锁(分外情形下也会有:purge + unique key)update加锁剖析

利用下面这张 students 表作为实例,个中 id 为主键,no(学号)为二级唯一索引,name(姓名)和 age(年事)为二级非唯一索引,score(学分)无索引。

聚簇索引,查询命中

UPDATE students SET score = 100 WHERE id = 15

在 RC (读已提交)和 RR (可重复读)隔离级别下加锁情形一样,都是对 id 这个聚簇索引加 X 锁

聚簇索引,查询未命中

UPDATE students SET score = 100 WHERE id = 16

RC 不加锁,RR 有 GAP 锁,id15到18间隙锁

二级唯一索引,查询命中

UPDATE students SET score = 100 WHERE no = 'S0003'

命中二级唯一索引,由于二级索引的叶子节点中保存了主键索引的位置,在给二级索引加锁的时候,主键索引也会一并加X锁。

二级唯一索引,查询未命中

RC 无锁,RR 隔离级别会加 GAP 锁。

二级非唯一索引,查询命中

RC 无锁,RR 隔离级别会加 GAP 锁。

二级非唯一索引,查询未命中

RC 无锁,RR 隔离级别会加 GAP 锁。

为什么非唯一索引会加 GAP 锁,而唯一索引不用加 GAP 锁?

GAP 锁的浸染是为理解决幻读,防止其他事务插入相同索引值的记录,而唯一索引和主键约束都已经担保了该索引值肯定只有一条记录,以是无需加 GAP 锁。

无索引

UPDATE students SET score = 100 WHERE score = 22

知足条件的虽然只有 1 条记录,但是聚簇索引上所有的记录,都被加上了 X 锁。

在没有索引的时候,只能走聚簇索引,对表中的记录进行全表扫描。
在 RC 隔离级别下会给所有记录加行锁,在 RR 隔离级别下,不仅会给所有记录加行锁,所有聚簇索引和聚簇索引之间还会加上 GAP 锁。

聚簇索引,范围查询

UPDATE students SET score = 100 WHERE id <= 20

RC把id = 20、18、15 三条记录锁住, RR 把 id = 30 这条记录以及 (20, 30] 之间的间隙锁住

对付范围查询,如果 WHERE 条件是 id <= N,那么 N 后一条记录也会被加上 Next-key 锁。
如果条件是 id < N,那么 N 这条记录会被加上 Next-key 锁。
如果 WHERE 条件是 id >= N,只会给 N 加上记录锁,以及给比 N 大的记录加锁,不会给 N 前一条记录加锁;如果条件是 id > N,也不会锁前一条记录,连 N 这条记录都不会锁。

二级索引,范围查询

UPDATE students SET score = 100 WHERE age <= 23

和聚簇索引的范围查询一样,除了 WHERE 条件范围内的记录加锁之外,后面一条记录也会加上 Next-key 锁

insert加锁

一样平常加锁都是对表中已有的记录进行加锁,而 INSERT 语句是插入一条新的记录,这条记录表华夏来就没有,但是并不是不须要加锁。

为了防止幻读,如果记录之间加有 GAP 锁,此时不能 INSERT如果 INSERT 的记录和已有记录造成唯一键冲突,此时不能 INSERT

对插入的间隙加插入意向锁(Insert Intension Locks),如果该间隙已被加上了 GAP 锁或 Next-Key 锁,则加锁失落败进入等待。
如果没有,则加锁成功,表示可以插入。

判断插入记录是否有唯一键,如果有,则进行唯一性约束检讨

如果不存在相同键值,则完成插入如果存在相同键值,则判断该键值是否加锁如果没有锁, 判断该记录是否被标记为删除如果标记为删除,解释事务已经提交,还没来得及 purge,这时加 S 锁等待;如果没有标记删除,则报 1062 duplicate key 缺点;如果有锁,解释该记录正在处理(新增、删除或更新),且事务还未提交,加 S 锁等待;插入记录并对记录加 X 记录锁;
标签:

相关文章

介绍皮肤设置,如何打造理想肌肤状态

随着科技的发展和人们对美的追求,皮肤设置已成为美容护肤的重要一环。如何根据皮肤类型、肤质、年龄等因素进行合理设置,已成为众多爱美人...

网站建设 2025-01-03 阅读1 评论0

介绍盖章制作,传承文化,彰显权威

自古以来,盖章在我国文化中具有重要的地位。从古代的官印、私印到现代的公章、合同章,盖章已成为一种独特的文化符号,承载着丰富的历史内...

网站建设 2025-01-03 阅读1 评论0

介绍监控破坏,技术手段与法律风险并存

随着科技的飞速发展,监控设备已遍布大街小巷,成为维护社会治安的重要手段。一些不法分子为了逃避法律制裁,开始研究如何破坏监控设备。本...

网站建设 2025-01-03 阅读1 评论0

介绍登录不上之谜,技术故障还是人为疏忽

随着互联网的普及,登录已成为人们日常生活中不可或缺的一部分。在享受便捷的登录不上这一问题也困扰着许多用户。本文将深入剖析登录不上之...

网站建设 2025-01-03 阅读1 评论0

介绍电脑键盘调出方法,让操作更高效

随着科技的发展,电脑已经成为了我们日常生活中不可或缺的工具。而电脑键盘,作为电脑输入设备,更是我们与电脑进行交流的桥梁。你是否知道...

网站建设 2025-01-03 阅读1 评论0

介绍磁力链,高效便捷的文件下载利器

在互联网高速发展的今天,文件下载已成为日常生活中不可或缺的一部分。而磁力链作为一种新型的文件下载方式,凭借其高效、便捷的特点,受到...

网站建设 2025-01-03 阅读1 评论0