当前位置: 代码网 > 服务器>网络>网络协议 > 数据库封锁协议和两段锁协议深入讲解

数据库封锁协议和两段锁协议深入讲解

2026年08月02日 网络协议 我要评论
什么是封锁协议事务对数据对象加锁时,需要遵循某些规则:是否加锁加锁类型什么时候加锁什么时候解锁不同阶段加锁,加锁不同以及释放锁的时间形成了不同的封锁协议,不同的封锁协议所能达到的系统一致性级别也不同数

什么是封锁协议

事务对数据对象加锁时,需要遵循某些规则:

  • 是否加锁
  • 加锁类型
  • 什么时候加锁
  • 什么时候解锁

不同阶段加锁,加锁不同以及释放锁的时间形成了不同的封锁协议,不同的封锁协议所能达到的系统一致性级别也不同

数据库并发调度产生的问题

  • 丢失修改:事务a修改id5的age为18,事务b修改id5的age为20,事务b先提交,事务a后提交,事务a会覆盖事务b的修改
事务a事务b
begin
update user set age = 18 where id = 5begin
update user set age = 20 where id = 5
commit
commit
  • 不可重复读:事务a两次读取id为5的age字段,第一次读取为18,此时事务b修改了id5的age字段为20并提交,事务a第二次读取时为20,同一个事务中两次读取值不同
事务a事务b
begin
select age from user where id = 5
# age为18
begin
update user set age = 20 where id = 5
commit
select age from user where id = 5
# age为20
commit
  • 脏读:事务a读取id5的age字段,事务b修改id5的age为20且未提交,事务a读取到了事务b未提交的数据,即age值为20,正常应该读到18
事务a事务b
begin
select age from user where id = 5
# age为18
begin
update user set age = 20 where id = 5
select age from user where id = 5
# age为20
commit
commit

三级封锁协议

保证事务的隔离性,数据的一致性

一级封锁协议

事务需要对数据做第一次写操作前(例如:insertupdate)需要加写锁,一直到事务结束才能释放锁,读操作不要求加锁

事务a事务b
执行对user表的update操作
获取写锁
获取成功,加锁
执行对user表的update操作
获取写锁
获取失败,等待
执行sql后commit等待
释放锁等待
获取写锁成功,加锁
执行sql后commit
释放锁

在此协议中,写操作需要加锁,可以解决并发调度中丢失修改问题,但是由于读操作不需要加锁,所以任何阶段都有可能读取到未提交的数据

二级封锁协议

在一级封锁协议基础上,事务对数据做读操作,需要加读锁,读后任意时刻可以释放

示例一:

事务a事务b
执行对user表的update操作
获取写锁
获取成功,加锁
执行对user表的select操作
获取读锁
获取失败,等待
执行sql后commit等待
释放锁等待
获取读锁成功,加锁
执行sql
释放锁
commit

示例二:

  • 事务a:查询user表所有信息
  • 事务b:查询用户id为5是否存在,不存在插入用户id为5的记录
事务a事务b
begin
获取读锁
获取成功
s(user)
begin
获取读锁
获取失败,等待
select * from user等待
释放锁unlock(user)等待
commit获取读锁成功
s(user)
select * from user where id = 5
释放锁unlock(user)
获取写锁
获取成功
x(user)
insert into user values(5, “xiaoming”)
commit
释放锁unlock(user)

此协议在读操作前加锁,因为同一时刻锁不能共同持有,那么就读取不到未提交的数据,可以解决脏读问题,但是锁在事务提交前释放,可能会造成第二次读取时数据与第一次不一致

三级封锁协议

在一级封锁协议基础上,若事务对数据做第一次读操作,要求对其加读锁,事务结束后才能释放锁

事务a事务b
执行对user表的update操作
获取写锁
获取成功,加锁
执行对user表的select操作
获取读锁
获取失败,等待
执行sql后commit等待
释放锁等待
获取读锁成功,加锁
执行sql
commit
释放锁

此协议只在第一次读取的时候加锁,同一个事务中多次读取操作不需要重新获取锁,且锁需要在commit后才能释放,可以解决不可重复读的问题

总结

封锁协议写锁读锁不丢失修改不读脏数据可重复读
一级事务全程加锁不加
二级事务全程加锁读前加,加后随时释放
三级事务全程加锁事务全程加锁

两段锁协议

two-phase locking(2pl),指在事务中需要包含两个阶段,一个是加锁阶段,一个是解锁阶段。在加锁阶段,事务需要获取到所需的锁,期间不可以释放任何锁;在解锁阶段,事务释放获取到的所有锁,且后面不可以再获取锁。两段锁协议是为了保证并发调度的可串行化

示例

  • 事务a:查询所有用户信息,更新id5的age为18
事务a阶段
begin
select * from user加锁阶段:获取s(user)
update user set age = 18 where id = 5加锁阶段:获取x(user)
commit
解锁阶段:释放s(user)、x(user)

总结 

到此这篇关于数据库封锁协议和两段锁协议的文章就介绍到这了,更多相关数据库封锁协议和两段锁协内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • Nginx中配置HTTP2协议的方法

    Nginx中配置HTTP2协议的方法

    在当今互联网的高速发展时代,网站的性能和用户体验变得至关重要。就好比在一场激烈的赛车比赛中,车辆的性能和配置决定了谁能率先冲过终点线。而在网站的世界里,http... [阅读全文]
  • Nginx 限流和流量控制的实现

    Nginx 限流和流量控制的实现

    nginx 提供了强大的流量控制功能。限制客户端在特定时间段内的请求次数,以保护服务器资源,防止因过载而导致的性能下降甚至服务不可用。限流在防止ddos攻击、爬... [阅读全文]
  • Nginx服务器配置https安全协议的实现

    一、简介http是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(tcp),用于从www服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,…

    2024年09月20日 网络
  • Ubuntu系统怎么禁用 IPv6 协议? ubuntu关闭ipv6的三种方法

    ipv6是最新的互联网协议,负责为网络设备提供标识和定位,并在互联网上路由流量。它于 1998 年开发,旨在替代早期的 ipv4 协议。ipv6 通过 128 位地址为每个设备分配…

    2024年08月21日 网络
  • 淘宝图片空间协议怎么签?有什么用处?

    淘宝图片空间协议怎么签?有什么用处?

    在2024年,淘宝依然是中国最大的电商平台之一,吸引了无数创业者和商家开设网店。对于新手来说,开设淘宝店铺可能看起来有些复杂,但只要按照... [阅读全文]
  • 5.2、运输层端口号、复用与分用的概念

    运行在计算机上的进程使用进程标识符PID来标志。因特网上的计算机并不是使用统一的操作系统不同格式的进程标识符为了使运行不同操作系统的计算机的应用进程之间能够进行网络通信使用统一的方…

    2024年08月06日 网络

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com