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
英文地址,請注明出處:http://en.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;正是把這些工程難題轉化為可用、可控、可交付的…