数据库两阶段锁+三种事务隔离级别+四种事务状态+五种加锁模式下如何加解锁的理解

两阶段锁+三种事务隔离级别+四种事务状态+五种加锁模式 下如何进行加解锁实现数据库功能。
(主要是在做 BusTub 项目之后就其中加解锁的理解)

三种事务隔离级别

一、READ UNCOMMITTED(读未提交)
1. 概念:在这个隔离级别下,一个事务可以读取到其他事务尚未提交的数据(脏读),这意味着事务之间的隔离性非常低。由于读取到未提交的数据可能会导致不一致的结果,因此这个隔离级别很少被使用。
2. 理解:对于一个数据,不需要等待,不管其他人是否正在修改,我就可以读。
二、READ COMMITTED(读已提交)
1. 概念:在这个隔离级别下,一个事务只能读取到已经提交的数据。这样可以防止脏读,即读取到未提交的数据。不过,在该隔离级别下,不同事务之间仍然可能出现重复读和幻读的问题。
2. 理解:对于一个数据,等待其他人全部用完,我才可以读。
三、REPEATABLE READ(可重复读)
1. 概念:在这个隔离级别下,一个事务在执行过程中多次读取同一数据,应该能够看到相同的结果。即使其他事务修改了该数据,事务也只能看到它在事务开始时的快照。这可以防止脏读和重复读,但仍然可能产生幻读。
2. 理解: 对于一个数据,等他其他人用完,我才读,并且读的时候不能其他人修改。我一旦读过或者写过,其他人就不能修改了,只能读。??

五种加锁模式

一、意向共享 intention-shared:表示事务意图读取数据但不修改,允许其他事务读取同一数据。

二、意向排他 intention-exclusive:表示事务计划修改数据,需要排他锁,但在获取排他锁之前,先设置意向排他锁。

三、共享意向排他 shared-intention-exclusive:一种较少见的锁模式,通常指在共享读取的同时,表明存在修改数据的意图。

四、共享 shared:允许多个事务读取同一数据,但不允许修改。通常用于实现只读操作。

五、排他 exclusive:仅允许一个事务访问数据,阻止其他事务读取或写入,用于数据修改操作。


为了进一步清晰数据库事务不同隔离级别下的加解锁过程,这里先引入了两阶段锁时事务的四种状态:

GROWING(增长):在事务的增长阶段,事务会获取需要修改的数据的锁。这些锁可以是共享锁(Shared Lock)或排他锁(Exclusive Lock),具体取决于事务的隔离级别和对数据的访问要求。在增长阶段,事务会逐步获取锁,并进行相应的读取和写入操作。

SHRINKING(缩减):在事务的缩减阶段,事务会释放已经持有的锁。这是在事务执行完所有操作后的阶段,事务将对数据所持有的锁进行释放,以允许其他事务对这些数据进行访问和修改。

COMMITTED(已提交):当事务顺利执行完所有的操作,并且成功地将所有的修改应用到数据库中时,事务进入"COMMITTED"状态。在这个状态下,事务的结果是永久性的,对其他事务可见。

ABORTED(已中止):当事务执行过程中遇到了错误或被显示回滚时,事务进入"ABORTED"状态。在这个状态下,事务的所有操作都被撤销,数据库返回到事务开始前的状态。

其中,涉及加解锁主要就是 GROWING(增长)和 SHRINKING(缩减)两个阶段。

三种事务隔离级别下加解锁过程

READ UNCOMMITTED(读未提交)

这个隔离级别下,读未提交的数据是通过不允许加 S 共享锁实现的(不加锁就不会冲突,从而随便读数据),只需考虑 X 类排他锁。
两阶段加锁协议的限制,进入缩减阶段,X 类的锁也不允许申请。

一、 GROWING(增长)阶段:
加锁:可以加 X 锁和 IX 锁。
解锁:可以解锁 X 锁和 IX 锁。释放 X 锁使进入 SHRINKING(缩减)阶段。
二、SHRINKING(缩减)阶段:
加锁:不能加锁。S 类锁本身就不能加,X 类锁在收缩阶段也不能加
解锁:不能解锁。没有加锁。

READ COMMITTED(读已提交)

读已提交本身允许多次读,并且允许多次读的结果不一致,因此释放读不进入收缩阶段,释放写锁才进入收缩阶段,阻止之后的写。
1.两阶段加锁保证了事务释放写锁之后就一定不会再次获得写锁并修改数据,
2.而读之前加读锁,又会和写锁冲突,从而实现了读到的就是已提交数据。

一、ROWING(增长)阶段:
加锁:五种锁都可以申请。
解锁:都可以释放。释放 X 锁使进入 SHRINKING(缩减)阶段。
二、SHRINKING(缩减)阶段:
加锁:可以加 S 和 IS 锁。
解锁:可以释放已经拿到的。增长和缩减获得的锁。

REPEATABLE READ(可重复读)

可重复读一旦释放 X 或 S 锁,都必须进入 shrinking 阶段,阻止本事务再次获得锁。
这是因为释放之后其他事务就可以申请到锁并修改数据,当前事务如果再申请一次,就可能是读到其他事务修改后的数据,导致前后读到的数据不一致,不符合隔离级别要求。

一、ROWING(增长)阶段:
加锁:五种锁都可以申请。
解锁:都可以释放。释放 X 锁 或者 S 锁时事务必须进入 SHRINKING(缩减)阶段。
二、SHRINKING(缩减)阶段:
加锁:不能加锁。
解锁:可以释放已经拿到的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值