SQL Server 并发控制 第四篇:Snapshot Isolation (SI) 和 Read Committed Snapshot Isolation (RCSI)

news/2025/11/3 19:16:39/文章来源:https://www.cnblogs.com/ljhdo/p/19187975

乐观控制模式假定阻塞很少,快照隔离通过使用行版本控制来避免大多数锁定和阻塞。当数据被修改时,受影响行的已提交版本会被复制到 tempdb 并赋予版本号,此操作称为写时复制 (Copy on Write),并用于所有的插入、更新和删除操作。当另一个会话读取相同的数据时,将返回读取事务开始时的复制到tempdb的已提交数据版本。

通过避免大多数锁定,这种方法可以比事务隔离以更低的成本显著提高并发性。当然,“天下没有免费的午餐!”,快照隔离也有一个隐藏的成本:tempdb 的使用量增加。SQL Server 中可用的两种快照隔离类型:

  • READ COMMITTED SNAPSHOT ISOLATION (RCSI)
  • SNAPSHOT ISOLATION

一,Read Committed Snapshot Isolation (RCSI)

在数据库上启用RCSI:

ALTER DATABASE <database name> SET READ_COMMITTED_SNAPSHOT ON;

检查数据库的隔离级别:

SELECT DB_NAME(database_id), is_read_committed_snapshot_on,snapshot_isolation_state_desc  
FROM sys.databases
WHERE database_id = DB_ID();

字段注释:

snapshot_isolation_state:State of snapshot-isolation transactions being allowed, as set by the ALLOW_SNAPSHOT_ISOLATION option:

  • 0 = Snapshot isolation state is OFF (default). Snapshot isolation is disallowed.
  • 1 = Snapshot isolation state ON. Snapshot isolation is allowed.
  • 2 = Snapshot isolation state is in transition to OFF state. All transactions have their modifications versioned. Can't start new transactions using snapshot isolation. The database remains in the transition to OFF state until all transactions that were active when ALTER DATABASE was run can be completed.
  • 3 = Snapshot isolation state is in transition to ON state. New transactions have their modifications versioned. Transactions can't use snapshot isolation until the snapshot isolation state becomes 1 (ON). The database remains in the transition to ON state until all update transactions that were active when ALTER DATABASE was run can be completed.

snapshot_isolation_state_Desc: Description of state of snapshot-isolation transactions being allowed, as set by the ALLOW_SNAPSHOT_ISOLATION option.

is_read_committed_snapshot_on:

  • 1 = READ_COMMITTED_SNAPSHOT option is ON. Read operations under the read-committed isolation level are based on snapshot scans and don't acquire locks.
  • 0 = READ_COMMITTED_SNAPSHOT option is OFF (default). Read operations under the read-committed isolation level use share locks.

RCSI的工作原理是:将所有运行在RCSI下的查询都改为使用快照扫描(snapshot scan),并且除了 Sch-S(schema stability))锁之外,不再获取其他锁。这样,即使是那些没有请求访问权限的查询,也能自动访问版本化的行。请看以下两个查询:

二,Snapshot Isolation

在数据库上把Allow  Snapshot Isolation选项设置为ON,但是这并不意味着启用了Snapshot Isolation,只是允许启用。

ALTER DATABASE MyOrders SET ALLOW_SNAPSHOT_ISOLATION ON;

快照隔离级别只能在会话级别上启用,下面的代码禁用RCSI,允许Snapshot Isolation,并在Session级别上启用了Snapshot Isolation:

ALTER DATABASE <DB_NAME> SET READ_COMMITTED_SNAPSHOT OFF;
ALTER DATABASE <DB_NAME> SET ALLOW_SNAPSHOT ON;SET TRANSACTION ISOLATION LEVEL SNAPSHOT;

 

 

这里用两个Query来模型快照隔离下的更新冲突:

image

抛出的错误消息是:

Msg 3960, Level 16, State 5, Line 7

Snapshot isolation transaction aborted due to update conflict. You cannot use snapshot isolation to access table ‘Orders. Orders’ directly or indirectly in database ‘MyOrders’ to update, delete, or insert the row that has been modified or deleted by another transaction. Retry the transaction or change the isolation level for the update/delete statement

 

最重要的部分是第一句话:“事务因更新冲突而中止。” 问题在于两个查询都试图更新同一行。当尝试提交第二个更新的行版本时,SQL Server 发现第一个事务也在尝试更新同一行。数据库引擎判断第二个更新操作的优先级更低,因此果断阻止第二个更新操作。这在某些方面类似于在悲观的事务隔离下可能发生的死锁。在事务隔离下,当两个或多个事务因为试图获取一个或多个不兼容的锁而发生锁冲突时,就会检测到死锁。使用行版本控制,可能会出现更新冲突,就像我遇到的情况一样。区别在于,锁冲突发生在事务提交之前,而更新冲突发生在提交期间,因为数据库引擎会将版本存储中的行与已提交的行进行比较,并发现不匹配。

 

引用文档:

Snapshot Isolation in SQL Server

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/954820.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

godot 描边插件

1:https://github.com/Magodra/GlowBorderEffect 2: outline.gdshader 不支持半透明:shader_type spatial; render_mode unshaded;/*Normal/Depth outline shader. Apply to nodes as a next pass shader texture.In…

对递归两层含义的理解

对递归两层含义的理解目录背景知识Definition从堆栈的角度理解递归缺点和For循环的区别总结Reference背景知识 先了解一下内存结构,但这个不是必须的。Definition 递归是一个循环结构,主要用来处理需要循环执行的任务…

怎么在现有App里融入AI对话能力

怎么在现有App里融入AI对话能力在数字化交互日益重要的今天,用户对App的智能化期望越来越高。尤其是在社交、电商、客服等领域,AI对话能力不仅能显著提升用户体验,还能有效降低运营成本。 但对于大多数开发团队而言…

DFS 序 O(1) 求 LCA

抛弃欧拉序,拥抱DFN。更新日志 2025/11/03:开工。思路 查询 \((dfn_u,dfn_v]\) 最小深度的节点的父亲即可。读者自证不难。

@pytest.fixture和setup/teardown

一.定义fixture 定义:@pytest.fixture是 Pytest 中用于定义​​测试夹具(Fixture)​​的核心装饰器,其核心作用是​​为测试用例提供可复用的资源初始化、数据准备和清理逻辑​​ 二:代替setup 和 teardownsetup =…

矿山通信如何实现全域一体化?迈威为煤矿装上了“智慧神经网络”

矿山通信如何实现全域一体化?迈威为煤矿装上了“智慧神经网络”在刚刚落幕的第二十一届中国国际煤炭采矿技术展上,全球矿业的目光再次聚焦于一个核心议题:数字化转型如何真正在矿山落地。作为这一进程的“神经中枢”…

Java异常处理实战精要:构建稳定应用的基石

在Java项目的开发历程中,异常处理是衡量代码健壮性与开发者专业度的重要标尺。一个处理得当的异常体系,能像程序的免疫系统一样,有效抵御外部的意外干扰,维持内部逻辑的稳定运行。本文将系统性地梳理Java项目中异常…

€$P2025

省流:唇膜玩 由于特殊原因把前面部分跳过 刚进考场被监考员扔到没人坐的一组的第一排,然后我的右边的右边的后面是小玉米 14:27 准时看 T1,这个 \(\frac{n}{2}\) 的限制导致最多只有一个部门会因为限制导致结果变小…

CSP2025 补题

游记没什么好搬的,链接。 T1 发现只会有一个超限,贪心换一下就行了。 T2 首先暴力枚举 \(k\) 拿边跑 MST 的复杂度是 \(O(2^knk + 2^kn\log nk)\) 的,考虑将 Kruskal 的 sort 换成 std::merge 即可通过,复杂度 \(O…

哈希学习总结

基本思想 哈希的核心思想在于,将输入映射到一个值域较小、可以方便比较的范围。 性质两个相同的元素哈希值相同。 两个不同的元素哈希值不同(若相同则称为冲突)。一维哈希(字符串哈希) 对于字符串 \(s\),其哈希值…

142.环形链表 II

var detectCycle = function(head) {if(!head)return null;let pre=head,cur=head;while(cur&&cur.next){pre=pre.next;cur=cur.next.next;if(pre===cur){let temp=head;while(temp!==pre){pre=pre.next;temp=…

2025 年 11 月制冷设备厂家推荐排行榜,小型制冷设备,空调制冷设备,工业制冷设备,商用制冷设备,大型制冷设备,制冷设备安装与维修服务公司推荐

2025 年 11 月制冷设备厂家推荐排行榜:小型、空调、工业、商用及大型制冷设备综合指南 行业背景与发展趋势 制冷设备行业作为现代工业和商业基础设施的重要组成部分,正经历着技术革新和市场需求的深刻变革。随着节能…

从创作到分析全搞定!2025公众号效率工具深度测评,这波升级95%的人还不知道

从创作到分析全搞定!2025公众号效率工具深度测评,这波升级95%的人还不知道作为新媒体运营者,你是否常陷入这些困境:熬夜赶稿后排版格式反复出错,跨平台分发时样式全乱;拟标题时反复修改仍无爆款潜力,配图怕侵权…

20232304 2025-2026-1 《网络与系统攻防技术》实验四实验报告

20232304 2025-2026-1 《网络与系统攻防技术》实验四实验报告 1.实验内容 一、恶意代码文件类型标识、脱壳与字符串提取 对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者…

k8s-java应用部署(4)

我们一个常见的应用,一般都会涉及到访问数据库,配置等外部资源。同时也将自己的能力提供给外部访问,前面已经介绍pod的内外网络通信 k8s-Pod中的网络通信(3) 这次直接做一个java应用, 开发——打镜像——配置并部署…

指数函数和对数函数

一、指数函数的定义与特点:指数函数的一般形式为f(x) = a^x,其中a为常数,x为自变量。它以自然常数e为底,也可以选择其他正实数作为底。指数函数的特点如下:1. 当a>1时,随着x的增大,指数函数迅速增大,呈现指…

单目三角化原理 - MKT

单目三角化原理 为什么V T 的最后一列就是解?第一和第二帧产生地图点后,如果进来第三帧,如何定位第三帧,并将其建立的新地图点和现有地图点合并一个坐标系。考虑到第三帧和第二帧的相对位姿尺度未必与第一帧…

[CEOI 2017] Sure Bet

神秘题目,本人用的贪心做的,发现一个二分写法,故记录一下。 题意 有 \(2N\) 个灯泡,分为 \(A\) 组和 \(B\) 组各 \(N\) 个。 你可以从中选取任意个灯泡,每选取一个灯泡需要花费 1 的代价。 在你选取完之后,系统会…

Java数组——三种初始化及内存分析,数组的基本特点,下标越界与小结

Java数组——三种初始化及内存分析,数组的基本特点,下标越界与小结内存分析 堆:存放new的对象与数组; 可以被所有线程共享,不会存放别的对象引用。栈:存放基本变量类型(会包含这个基本类型的具体数值) 引用对象…