MySQL三级封锁协议

《数据库事务和锁(悲观锁 乐观锁 共享锁 排它锁 行锁 表锁)详解》文章中可以了解到事务并发会引发的四个问题:更新丢失、脏读、不可重复度、幻读,可以通过设置隔离级别来决定事物之间的影响程度从而在一定程度上避免这四个问题。隔离级别的实现大多采用数据库的锁机制:共享锁(S锁)、排它锁(X锁)。
在运用X锁和S锁对数据对象加锁时,还需要约定一些规则 ,例如何时申请X锁或S锁、持锁时间、何时释放等。称这些规则为封锁协议(Locking Protocol)。对封锁方式规定不同的规则,就形成了各种不同的封锁协议。不同的封锁协议,在不同的程度上为并发操作的正确调度提供一定的保证。

一级封锁协议

事务 T 要修改数据 A 时必须加 X 锁,直到 T 结束才释放锁。

可以解决丢失更新问题,因为事务A对数据集加了排它锁,其他事务只能等到事务A释放锁(提交或者回滚后)才能修改该数据集,那么事务的修改就不会被覆盖。由于是修改的时候才加X锁,所有A事务不进行修改期间,其他事务可以对该数据集进行修改操作,并没有解决其他三个问题。

二级封锁协议

在一级的基础上,要求读取数据 A 时必须加 S 锁,读取完马上释放 S 锁。

可以解决丢失更新、脏读问题,因为如果一个事务在对某个数据集 进行修改,根据 1 级封锁协议,会加 X 锁,那么就不能再加 S 锁了,根据2级封锁协议,读数据必须加S锁,因此也就不会允许其他事务在一个事务修改数据时读该数据。由于A事务读取完一个数据集后立即释放了S锁,此时其他事务可以修改该数据集,A事务再次读取相同的数据集的时候发现和之前不一样了,因此不能解决不可重复读、幻读问题。

三级封锁协议

在二级的基础上,要求读取数据 A 时必须加 S 锁,直到事务结束了才能释放 S 锁。

可以解决丢失更新、脏读、不可重复读的问题,因为事务A读取数据集T 时,其它事务不能对T加 X 锁,从而避免了在读的期间数据发生改变。而且只有当事务A结束了才释放S锁,因此多次读取数据集时一样的结果。但是由于其他事务可以对该表进行插入操作,因为这并没有影响到数据集T,因此并没有消除幻读(即事务B插入主键id为2的数据,无论事务B提交与否,事务A select的时候只能读到开启事务之前就存在表中的id为1的记录,所有事务A插入主键id为2的数据报错),因此没有解决幻读。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值