架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 12488|回复: 3

[资料] SQL Server 多版本并发控制

[复制链接]
发表于 2021-1-28 17:55:52 | 显示全部楼层 |阅读模式
数据库的一致性,也是衡量DBMS性能的重要指标之一。目前大多数商业数据库(DB2, SQL Server)的并发控制采用的是两阶段锁(Two-Phase Locking,2PL)协议,2PL保证了并发事务执行的可串行化。但2PL在对任何数据进行读、写操作之前,需要对该数据加锁。在封锁相容矩阵中,S锁(Share Locks,共享锁)和X锁(Exclusive Locks,排它锁)是不相容的,因此当事务1正对数据A进行读操作(加S锁)时,事务2想要对数据进行写操作(加X锁),那么事务2必须等待事务1释放数据A上的S锁,才能继续执行。多版本并发控制(Multi-Version Concurrency Control,MVCC)较好地解决了这一问题。在多版本的系统中,每一次写数据均产生一个新的版本,读操作可以根据需要读取合适的版本,因此读写操作互不阻塞。MVCC虽然提高了并发度,但也带来了维护多个版本的存储开销。

Microsoft SQL Server 数据库引擎引入了现有事务隔离级别的一种新的实现方式 - 已提交读,用于提供使用行版本控制的语句级快照。SQL Server 数据库引擎还引入了一个新的事务隔离级别 - 快照,用于提供也使用行版本控制的事务级快照。

将 READ_COMMITTED_SNAPSHOT 数据库选项设置为 ON 可启用使用行版本控制的已提交读隔离。将 ALLOW_SNAPSHOT_ISOLATION 数据库选项设置为 ON 可启用快照隔离。为数据库启用任一选项时,数据库引擎都将保持被修改的每一行的版本。每当某个事务修改行时,修改前的该行图像将被复制到版本存储区的一页中。版本存储区是 tempdb 中的数据页集合。如果有多个事务修改行,则该行的多个版本将被链接到一个版本链中。使用行版本控制的读操作将检索每一行在事务或语句启动时已提交的最后一个版本。

为 SQL Server 2008编写的或 SQL Server 中新增的应用程序,通过在 READ_COMMITTED_SNAPSHOT 数据库选项为 ON 时指定读提交的事务隔离级别,来实现使用行版本控制的读提交的隔离。所有读操作都将查看语句启动时已提交的行版本。这将提供数据的语句级快照。

为 SQL Server 编写的应用程序将通过在 ALLOW_SNAPSHOT_ISOLATION 数据库选项为 ON 时指定快照事务隔离级别,来实现快照隔离。快照事务中的所有读操作都将查看事务启动时已提交的行版本。这将提供数据的事务级快照。

对于使用基于行版本控制的隔离级别的事务,读操作不对数据请求共享锁。这意味着使用行版本控制的读取器不会妨碍其他读取器或编写器访问同一数据。同理,编写器也不会妨碍读取器。但是,编写器会互相妨碍(即使是在基于行版本控制的隔离级别下运行)。两个写操作不能同时修改同一数据。

“快照隔离”功能扩展了 SQL Server 2008 中的锁定框架,它使应用程序能够在发生任何数据修改之前查看值。这可防止应用程序被锁定,同时仍将提供真正已提交的数据。SQL Server 2008 的 Read Committed Snapshot 需要数据库管理员来激活,允许数据被只读事务读取。所以 SI 对只读事务的并发控制效果是很好的,但是对更新事务是否也这样不得而知。对长时间运行的更新事务来说更为不利于与短期的高竞争性事务。如果跨数据库的事务试图使用 快照隔离(SI)标准 ,而不是所有数据库都设定的话,则该事务会失败。这无疑给可扩展性带来一定的障碍。看来微软要实现自己的比 SQL 92 规范还要强的 SI 还有很多路要走。

在任何一个修改之前,先对修改前的版本做一个复制 ,后续的一切读操作都会去读这个复制的版本,修改将创建一个新的版本。在这种处理方式下,读、写操作不会相互阻塞。使用这种行版本控制机制的好处,是程序的并发性比较高,但是缺点是用户读到的虽然不是一个脏数据,但是可能是个正在被修改马上就要过期的数据值。如果根据这个过期的值做数据修改,会产生逻辑错误

sql 命令:


参考链接:

http://blog.itpub.net/29018063/viewspace-1975432/
https://docs.microsoft.com/zh-cn/sql/relational-databases/sql-server-transaction-locking-and-row-versioning-guide?view=sql-server-ver15
https://www.cnblogs.com/qanholas/archive/2012/01/04/2312412.html
https://www.cnblogs.com/liuzhendong/archive/2010/11/18/1881068.html
https://cloud.tencent.com/developer/article/1032013
https://www.cnblogs.com/xwdreamer/archive/2012/07/30/2615357.html





上一篇:Elasticsearch(ES)复制克隆索引
下一篇:cubase10.5教程
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-1-29 09:13:40 | 显示全部楼层
xuexi
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-7-15 20:37:16 | 显示全部楼层
我要我要我要我要我我要
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-12-12 01:22:12 | 显示全部楼层
我要我要我要我要
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-5-29 15:20

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表