SQL Server事务隔离级别

SQL Server 提供了多个事务隔离级别,用于控制并发事务如何访问和修改数据时的可见性、锁定行为以及可能遇到的并发问题(如脏读、不可重复读、幻读)。这些级别在数据一致性、并发性能和锁定开销之间进行权衡。

以下是 SQL Server 支持的主要隔离级别,分为 标准 ANSI 隔离级别SQL Server 特有的扩展隔离级别

📌 一、标准 ANSI 隔离级别

  1. READ UNCOMMITTED (读未提交)

    • 行为:允许事务读取其他事务尚未提交(可能被回滚)的数据(脏读)。
    • 锁定:SELECT 语句不加共享锁,因此不会阻塞其他事务的写操作(更新/删除),但可能被写操作阻塞。
    • 问题:可能发生脏读、不可重复读、幻读。
    • 适用场景:对数据准确性要求极低,追求最高并发性能且可容忍脏数据的场景(如近似统计)。
    • 语法SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 或表提示 WITH (NOLOCK) 😅。
  2. READ COMMITTED (读已提交) - SQL Server 默认级别

    • 行为:确保事务只能读取已提交的数据(避免脏读)。
    • 锁定:SELECT 语句在读取数据时加共享锁,读取完成后立即释放锁(即使事务未结束),不会阻塞其他事务的读,但会阻塞其他事务对相同数据的写(反之亦然)。
    • 问题:可能发生不可重复读(同一事务内两次读取同一行可能不同)、幻读(同一查询两次执行返回的行集不同)。
    • 变体:SQL Server 支持两种实现:
      • READ COMMITTED (基于锁 - Locking):传统方式,使用共享锁。
      • READ COMMITTED SNAPSHOT (基于行版本 - RCSI):见下文扩展级别。
    • 语法SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
  3. REPEATABLE READ (可重复读)

    • 行为:确保同一事务内多次读取相同行数据的结果一致(避免脏读和不可重复读)。
    • 锁定:SELECT 语句在读取的数据上加共享锁,并持有到事务结束(而不是读完就释放)。阻止其他事务修改这些行。
    • 问题:可能发生幻读(其他事务可以插入新行,导致同一查询返回更多行)。
    • 语法SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
  4. SERIALIZABLE (可序列化)

    • 行为:最高隔离级别,确保事务完全串行执行的效果(避免脏读、不可重复读和幻读)。
    • 锁定:SELECT 语句在查询涉及的数据范围(不仅仅是行)上加范围锁(Range Locks),并持有到事务结束。阻止其他事务修改已有数据,也阻止插入或删除影响查询结果的新数据。
    • 问题:锁定范围最大,并发性能最低,死锁风险最高
    • 语法SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

二、SQL Server 特有的扩展隔离级别 (基于行版本控制)

这些级别利用 tempdb 数据库存储数据的行版本,读操作不阻塞写操作,写操作也不阻塞读操作(非阻塞读取),大大提高了并发性。

  1. SNAPSHOT (快照)

    • 行为:事务启动时看到的是一个一致的数据库快照(基于事务开始时间点)。在整个事务过程中,所有读取操作都基于该快照,不受其他事务修改的影响。
    • 锁定:SELECT 不加共享锁(读取的是版本)。写操作(UPDATE/DELETE)仍需获取锁并可能被阻塞/阻塞其他写操作。
    • 优点:避免脏读、不可重复读、幻读(因为基于快照)。读写不互相阻塞(高并发)。
    • 问题
      • 更新冲突:如果事务尝试修改一个自其快照后被其他事务修改过的行,会收到 Update conflict 错误 (错误 3960),事务会中止(需要应用程序重试)。
      • tempdb 开销:需要额外的空间和 I/O 来存储行版本。
    • 启用要求:数据库选项 ALLOW_SNAPSHOT_ISOLATION 必须设为 ON
    • 语法SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
  2. READ COMMITTED SNAPSHOT (已提交读快照 - RCSI)

    • 本质:这是 READ COMMITTED 隔离级别的行版本控制实现变体,不是一个独立的 ANSI 级别。
    • 行为:每个 SELECT 语句看到的是该语句开始时(不是事务开始时)已提交的所有数据。避免了脏读。
    • 锁定:SELECT 不加共享锁(读取的是最新已提交的版本)。写操作仍需锁。
    • 优点:避免了脏读,读操作不阻塞写操作,写操作也不阻塞读操作。比 SNAPSHOT 更少的 tempdb 版本存储开销(版本在语句结束时可能被清理)。
    • 问题:仍然可能发生不可重复读幻读(因为每个语句看到的是当前时间点的最新提交版本)。
    • 启用要求:数据库选项 READ_COMMITTED_SNAPSHOT 必须设为 ON。开启后,所有使用默认 READ COMMITTED 级别的事务自动使用 RCSI 语义。
    • 语法:开启选项后,使用 SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 即生效(无需特殊语法指定 RCSI)。

📊 隔离级别总结表

隔离级别脏读(Dirty Read)不可重复读(Non-Repeatable Read)幻读(Phantom Read)并发性锁定/阻塞行为实现机制
READ UNCOMMITTED✅ 可能✅ 可能✅ 可能⭐⭐⭐⭐ 最高无共享锁,读写可能互相阻塞锁(Locking)
READ COMMITTED (默认 - 锁)❌ 避免✅ 可能✅ 可能⭐⭐⭐共享锁(即时释放),读写互斥锁(Locking)
REPEATABLE READ❌ 避免❌ 避免✅ 可能⭐⭐共享锁(事务结束释放)锁(Locking)
SERIALIZABLE❌ 避免❌ 避免❌ 避免⭐ 最低范围锁(事务结束释放)锁(Locking)
SNAPSHOT❌ 避免❌ 避免❌ 避免⭐⭐⭐SELECT无锁(读版本)行版本控制(RVC)
READ COMMITTED SNAPSHOT (RCSI)❌ 避免✅ 可能✅ 可能⭐⭐⭐⭐SELECT无锁(读版本)行版本控制(RVC)

🔧 选择建议

  • 默认 (READ COMMITTED) / RCSI:适用于大多数场景,平衡一致性和性能。RCSI 是许多现代应用的首选,因其读写不阻塞的特性。
  • SNAPSHOT:需要事务内读取完全一致且避免所有 ANSI 异常,并能处理更新冲突的场景。
  • REPEATABLE READ / SERIALIZABLE:需要严格保证可重复读或避免幻读,且能接受较高锁开销和死锁风险的场景。
  • READ UNCOMMITTED:仅用于对脏读不敏感、追求极致读取速度的场景(慎用)。

💡 关键点

  • 设置级别:SET TRANSACTION ISOLATION LEVEL <level>; (会话级) 或使用表提示 (如 WITH (NOLOCK), WITH (SNAPSHOT))。
  • READ COMMITTED SNAPSHOTSNAPSHOT 需要先在数据库级别启用相应选项 (ALTER DATABASE ... SET ... ON)。
  • 隔离级别主要影响 SELECT 语句的行为和锁定,写操作 (INSERT, UPDATE, DELETE, MERGE) 在任何级别下通常仍需要获取并持有适当的锁(如排他锁)。
  • 选择合适的隔离级别对应用程序的正确性、性能和可伸缩性至关重要。

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

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

相关文章

DeepSeek R1大模型微调实战-llama-factory的安装与使用

文章目录概要1.安装必要的环境2.安装 PyTorch3.安装 Transformers 和 Datasets4.克隆 LLaMA Factory 仓库和安装LLaMA Factory5.准备数据和模型配置6.运行 LLaMA Factory7.监控和调整8.后续步骤概要 LLaMA Factory 是一个简单易用且高效的大型语言模型训练与微调平台。通过它&…

IDE mac M芯片安装报错:如何解决“InsCode.app 已损坏”,无法打开

IDE mac M芯片安装报错&#xff1a;如何解决“InsCode.app 已损坏”&#xff0c;无法打开 摘要 在 macOS 上安装并运行 InsCode IDE 时&#xff0c;不少开发者会遇到这样的报错&#xff1a; “InsCode.app 已损坏&#xff0c;无法打开。您应该将它移到废纸篓。” 这种情况在 …

EasyExcel:阿里开源的高效 Excel 处理工具,轻松解决 POI 内存溢出问题

在日常开发中&#xff0c;Excel 文件的导入导出是非常常见的需求。无论是数据批量导入、报表生成还是数据备份&#xff0c;我们都离不开对 Excel 的操作。但传统的 POI 框架在处理大数据量 Excel 时&#xff0c;常常会遇到内存溢出的问题&#xff0c;让开发者头疼不已。 今天给…

软件启动时加配置文件 vs 不加配置文件

一、基本概念不加配置文件启动直接执行启动命令&#xff0c;使用软件自带的默认参数。方便、快速&#xff0c;适合测试环境。缺点&#xff1a;灵活性差、配置不可控、不安全。redis-server zookeeper-server-start.sh kafka-server-start.sh指定配置文件启动启动时加载外部配置…

[ubuntu][C++]onnxruntime安装cpu版本后测试代码

下载官方预编译包后&#xff0c;怎么用呢。可以参考这个源码跑测试环境&#xff1a;ubuntu22.04onnxruntime1.18.0测试代码&#xff1a;CMakeLists.txtcmake_minimum_required(VERSION 3.12) project(onnx_test)# 设置C标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD…

栈:有效的括号

题目描述&#xff1a;给定一个只包含‘[’,{,(,),},]的字符串&#xff0c;判断该字符串是否括号有效。 括号有效的要求是&#xff1a; 每个左括号都有对应的右括号。每个右括号都有对应的左括号。左括号必须以正确的顺序闭合。 示例 1&#xff1a; 输入&#xff1a;s "…

微前端架构:解构前端巨石应用的艺术

在数字化转型浪潮中&#xff0c;企业级前端应用正变得日益复杂。微前端架构作为一种创新的解决方案&#xff0c;正在重新定义大型前端应用的构建方式&#xff0c;使多个团队能够独立开发和部署功能模块一、微前端架构的核心价值理念微前端架构的本质是将后端微服务理念扩展到前…

《LangChain从入门到精通》系统学习教材大纲

&#x1f4da; 《LangChain从入门到精通》系统学习教材大纲 目标&#xff1a;帮助你系统掌握LangChain理论与实践&#xff0c;成为具备独立开发能力的AI应用开发者。 学习周期建议&#xff1a;8~12周&#xff08;每天2~3小时&#xff09;&#xff0c;配合项目实战可加速成长。 …

Redis 的相关文件作用

Java 项目中使用 Redis 的相关文件&#xff0c;下面我来逐一解释它们的作用&#xff1a;1. RedisDemoApplicationTests.java 作用&#xff1a;这是 Spring Boot 项目的测试类。用途&#xff1a; 通常用于写单元测试或集成测试。测试 Redis 功能是否正常&#xff0c;比如连接、读…

【React】性能提升方案:Reat.memo, useMemo,useCallback用法详解

前言&#xff1a;Reat.memo, useMemo,useCallback是React中用于性能优化的三个核心API&#xff0c;它们分别针对组件渲染&#xff0c;计算缓存和函数引用进行优化。一、React.memo作用&#xff1a;缓存组件&#xff0c;当父组件重新渲染时&#xff0c;若子组件的props未变化&am…

Alibaba Cloud Linux 3 安装Docker

Alibaba Cloud Linux 3 基于 Red Hat Enterprise Linux (RHEL) 兼容内核&#xff0c;安装 Docker 的步骤与 RHEL/CentOS 系列类似&#xff0c;以下是具体操作&#xff1a; 1. 卸载旧版本&#xff08;如有&#xff09; sudo dnf remove docker docker-client docker-client-la…

每日一练001.pm

题目详情&#xff1a; P5705 【深基2.例7】数字反转 - 洛谷 题目描述 输入一个不小于 100 且小于 1000&#xff0c;同时包括小数点后一位的一个浮点数&#xff0c; 例如 123.4 &#xff0c;要求把这个数字翻转过来&#xff0c;变成 4.321 并输出。 #include<iostream&g…

AI智能优化SEO关键词策略实战

本文聚焦AI如何智能优化SEO关键词策略&#xff0c;通过实战案例分享高效技巧&#xff0c;帮助提升网站搜索排名和流量转化效果。内容涵盖AI革新关键词策略的原理、智能优化技巧的实际应用、高效关键词布局方法、避免常见错误的实战指南&#xff0c;以及综合策略推动排名飞跃的路…

360° 拖动旋转的角度计算原理

360 拖动旋转的角度计算原理 简化的 正方形 div demo 专注讲清楚「点击 / 拖动如何计算角度」这个原理&#xff0c;没有精美 UI哦 中间标注中心点鼠标点击或拖动时&#xff0c;计算当前位置相对于中心的角度在页面上实时显示角度代码示例&#xff08;原生 HTML JS&#xff09;…

五分钟XML速成

原文链接&#xff1a; XML - Dive Into Python 3 深入探讨 本书几乎所有章节都围绕一段示例代码展开&#xff0c;但 XML 并非关于代码&#xff0c;而是关于数据。 XML 的一个常见用途是 “聚合提要”&#xff08;syndication feeds&#xff09;&#xff0c;用于列出博客、论坛…

如何直接访问docker容器中的端口服务而不需要改端口映射

查看docker容器对于宿主服务器的ip地址 docker inspect -f {{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}} $容器名 # 替换$容器名 为自己的启动docker内的服务&#xff0c;监听端口是否用信息 curl http://172.17.0.2:90有信息就可以直接通过该ip访问docker容器端口…

《Istio故障溯源:从流量劫持异常到服务网格的底层博弈》

服务网格常被企业视为微服务通信复杂性的“终极方案”。不少团队在部署Istio时,往往满足于“控制面启动、Sidecar注入成功”的表层验证,却忽视了底层机制与业务场景的深度适配—这种“重部署轻调优”的心态,往往为后续的生产故障埋下隐患。某大型金融机构的核心交易中台在接…

第24节:3D音频与空间音效实现

第24节&#xff1a;3D音频与空间音效实现 概述 3D音频是构建沉浸式体验的关键组件&#xff0c;它通过模拟真实世界中的声音传播特性&#xff0c;为用户提供空间感知和方向感。本节将深入探讨Web Audio API与Three.js的集成&#xff0c;涵盖空间音效原理、音频可视化、多声道处理…

一步搞清楚本地客户端和全局服务器是如何更新模型的

我们可以把它想象成一个 “老师”和“学生” 协作学习的过程。全局服务器 “老师”本地客户端 “学生”整个模型更新的过程遵循一个核心原则&#xff1a;“数据不动&#xff0c;模型动”。原始数据永远留在本地客户端&#xff0c;只有模型的参数&#xff08;即模型的“知识”…

跨平台超低延迟RTSP播放器技术设计探究

摘要 RTSP 播放在实验室里“跑起来”并不难&#xff0c;难的是在真实场景中做到 超低延迟、跨平台、高稳定&#xff0c;并长期可靠运行。大牛直播SDK&#xff08;SmartMediaKit&#xff09;的全自研跨平台 RTSP 播放栈&#xff0c;正是把这些工程难题转化为可用、可控、可交付的…