这条语句可以保护库存资源防止超卖,我们不妨分析这条语句为什么生效。本文使用MySQL Innodb引擎进行演示,隔离级别为可重复读。
1.1 共享锁与排它锁
===========
共享锁(share Lock)又被称为读锁,实现共享锁语句如下:
select lock in share mode
排它锁(exclusive Lock)又被称为写锁,实现排它锁语句如下:
select for update
update
delete
insert
共享锁与排它锁兼容关系如下表:
我们通过实例分析上述兼容关系,首先建一张测试表并写入测试数据:
CREATE TABLE test_account
(
id
bigint(20) NOT NULL,
name
varchar(20) DEFAULT NULL,
account
bigint(20) DEFAULT NULL,
version
bigint(20) DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into test_account
(id
,name
,account
,version
) values (1,‘A’,100,1);
insert into test_account
(id
,name
,account
,version
) values (2,‘B’,200,1);
insert into test_account
(id
,name
,account
,version
) values (3,‘C’,300,1);
(1) 读读兼容
========
共享锁与共享锁之间兼容,在如下实例中session1在t3时刻,session2在t4时刻执行查询均可以获取预期结果:
(2) 读写互斥
========
共享锁与排它锁之间互斥,在如下实例中session1在t3时刻加共享锁,可以正确读取结果,但是session2在t4时刻尝试加排它锁,但是此时锁被session1占有,session2需要等待,当session1长时间不释放锁时,session2抛出锁超时异常:
(3) 写写互斥
========
排它锁与排它锁之间互斥,在如下实例中session1在t3时刻加排它锁,可以正确读取结果,但是session2在t4时刻尝试加排它锁,但是此时锁被session1占有,session2需要等待,当session1长时间不释放锁时,session2抛出锁超时异常:
1.2 当前读与快照读
===========
MySQL Innodb存储引擎实现基于多版本并发控制协议MVCC,在MVCC并发控制中读操作可以分成快照读与当前读。
快照读不需要加锁,读取的是记录可见版本,有可能是历史版本。可以类比订单快照,用户下单之后商品价格发生了变化,但是订单快照不会改变。实现当前读语句如下:
select
当前读需要加锁,读取的是记录最新版本,加锁保证了在读取时,当前记录不会被其它事务修改。实现当前读语句如下:
select lock in share mode
select for update
update
delete
insert
我们通过一个实例分析快照读和当前读,session2在t4时刻修改记录并在t5时刻提交,session1在t6时刻进行了快照读,读取的是本事务开始时结果100,在t7时刻进行了当前读,读取的是记录最新版本结果101:
当前读流程是怎么样的呢?我们以update为例进行分析当前读流程:
第一次程序实例发出当前读请求,存储引擎返回满足where条件的第一条记录并加锁,程序实例再发出更新请求,存储引起操作完成响应成功。依次执行直到所有满足where条件记录执行完成为止。
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
d开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!