sql server 鎖與事務撥雲見日(中)

来源:https://www.cnblogs.com/MrHSR/archive/2018/06/07/9130349.html
-Advertisement-
Play Games

一.事務的概述 上一章節里,重點講到了鎖,以及鎖與事務的關係。離上篇發佈時間好幾天了,每天利用一點空閑時間還真是要堅持。聽《明朝那些事兒》中講到"人與人最小的差距是聰明,人與人最大的差距是堅持"很經典的一句話一直記得。這篇重點圍繞事務來開展。涉及的知識點包括:事務的概述,事務併發控制模型,併發產生的 ...


一.事務的概述

   上一章節里,重點講到了鎖,以及鎖與事務的關係。離上篇發佈時間好幾天了,每天利用一點空閑時間還真是要堅持。聽《明朝那些事兒》中講到"人與人最小的差距是聰明,人與人最大的差距是堅持"很經典的一句話一直記得。這篇重點圍繞事務來開展。涉及的知識點包括:事務的概述,事務併發控制模型,併發產生的負面影響,事務隔離級別以及不同的表現。本章多以文字描述為主,沒有多少代碼量,重點是闡述不同隔離級別的不同表現,在以後的業務中,涉及到事務時,本文可以用來做個參考。

1.1 事務ACID

    事務作為一個邏輯工作單元執行一系列的操作,它包括四個屬性:原子性、一致性、隔離性和持久性 (ACID) 屬性, 只有這樣才能成為一個事務。  

    原子性:當一個事務被當作一個單獨的工作單元時,不管事務內有什麼,都是一個整體。對於其數據修改,要麼全都執行,要麼全都不執行。  

       一致性:事務在完成時,必須使所有的數據都保持一個邏輯一致狀態。   

  隔離性:併發事務所做的修改必須與其他併發事務所做的修改隔離。 事務能識別數據所處的狀態,要麼是另一併發事務修改它之前的狀態,要麼是併發事務修改它之後的狀態。

  持久性:一但事務完全,它的效果是永久存於系統的。該修改即使出現系統故障也將一直保持。 SQL Server 2014和更高版本啟用延遲的持久事務。

1.2 事務的操作模式有幾下幾種:

  自動提交事務:每條單獨的語句都是一個事務。

  顯式事務:每個事務均以 BEGIN TRANSACTION 語句顯式開始,以 COMMIT 或 ROLLBACK 語句顯式結束。

  隱式事務:在前一個事務完成時新事務隱式啟動,但每個事務仍以 COMMIT 或 ROLLBACK 語句顯式完成。

  批處理級事務:只能應用於多個活動結果集 (MARS),在 MARS 會話中啟動的 Transact-SQL 顯式或隱式事務變為批處理級事務。在sql server 2000 必須對每個 SqlCommand 對象使用獨立的 SqlConnection 對象。但是 SQL Server 2005 啟用了 MARS,可以共用一個SqlConnection 對象。

       本章重點講到顯式事務的隔離級別

二. 事務併發模型

  2.1 併發訪問是指:多用戶同時訪問一種資源被視為併發訪問資源。 併發數據訪問需要某些機制,以防止多個用戶試圖修改其他用戶正在使用的資源時產生負面影響,機制就是下麵講的事務隔離級別。處於活動狀態而不互相干涉的併發用戶數據越多,併發性就越好。當一個正在修改數據的用戶阻止了其他用戶讀取數據,或者當一個正在讀取數據的用戶阻止了其它用戶修改數據時,併發性就降低了。

  2.2 併發類型

    在sqlserver里資料庫系統可以採用兩種方式來管理併發數據訪問:樂觀併發控制和悲觀併發控制,在sql server 2000以前只有悲觀併發。樂觀併發控制是一種稱為行版本控制(row versioning)的技術支持。這二種技術併發控制的區別在於:是在衝突發生前進行防止,還是在發生後採用某種方法來處理衝突。

  悲觀併發控制

      在悲觀併發中,sql server是獲取鎖來阻塞對於其它用戶正在使用數據的訪問。  用戶操作的讀與寫之間是會互相阻塞的。

       樂觀併發控制

    樂觀併發控制預設採用行版本控制使其它用戶能夠看到修改操作發生以前的數據狀態,舊版本數據行會保存下來。因些讀取數據不會受到其它用戶正對該數據進行修改操作的影響,換言之修改數據不會受到其它用戶正對該數據進行讀取影響。 因為讀取用戶訪問的數據行是一個被保存過的版本。  用戶讀與寫之間不會互相阻塞,但寫與寫還是會發生阻塞。

  2.3  事務併發帶來的負面影響

       修改數據的用戶會影響同時讀取或修改相同數據的其他用戶。 即這些用戶可以併發訪問數據。 如果數據存儲系統沒有併發控制,則用戶可能會看到以下負面影響:

併發影響 

定義

丟失更新                                                            

       當兩個或多個事務選擇同一行,然後基於最初選定的值更新該行時,會發生丟失更新問題。 每個事務都不知道其他事務的存在。   最後的更新 將覆蓋由其他事務所做的更新,這將導致數據丟失。 

臟讀

 當一個用戶修改了數據但尚未提交修改,而另一個正在讀取的用戶會讀到這個修改從而導致不一致的狀態發生。

不可重覆讀

一個用戶在同一個事務中分別以兩個讀操作間隔讀取相同資源時可能會得到不同的值。

虛擬讀取(幻影)

一個事務里執行兩個相同的查詢,但第二個查詢返回的行集合是不同的,此時就會發生虛擬讀取。這種情況發生在where 查詢中,比如 where count(1)<10。  同一個事務中多次使用相同的條件查詢,select操作返回不同數據的結果集。

三.事務隔離級別

  在sql server 2005及以上 支持五種隔離級別來控制“讀”操作的行為,其中有三個是悲觀併發模式,一個是樂觀併發模式,剩下一個存在兩種模式。 下麵介紹隔離級別從允許的併發負作用(例如臟讀或虛擬讀取)的角度進行描述。

隔離級別

 定義

未提交讀
READUNCOMMITTED 

 隔離事務的最低級別,未提交讀不會發出共用鎖,允許臟讀,一個事務可能看見其他事務所做的尚未提交的更改。未提交讀不會發出共用鎖. 該項的作用與與SELECT表上加NOLOCK相同。

 

已提交讀
READ COMMITTED

 一個事務不能讀取其它事務修改但未提交的數據,避免了臟讀。事務內語句運行完後便會釋放共用鎖,而不是等到事務提交的時候。 這是資料庫引擎預設級別。

可重覆讀
REPEATABLE READ

 事務內查詢語句運行完後不會釋放共用鎖,而是等到事務提交後.其它事務不能修改,刪除,但可以插入新數據。
 因為不是範圍鎖,可能發生虛擬讀取

 可序列化SERIALIZABLE

 隔離事務的最高級別,事務之間完全隔離。 阻止其它事務刪除或插入任何行。 相當於SELECT上加HOLDLOCK相同, SELECT 操作使用 WHERE 子句時獲取範圍鎖,主要為了避免虛擬讀取

已提交讀 快照隔離
READ COMMITTED SNAPSHOT ISOLATION level (RCSI)

當 READ_COMMITTED_SNAPSHOT 資料庫選項設置為 ON 時,已提交讀隔離使用行版本控制提供語句級讀取一致性。 讀取操作只需要 SCH-S 表級別的鎖,不需要頁鎖或行鎖。 使用行版本控製為每個語句提供一個在事務上一致的數據快照,因為該數據在語句開始時就存在。 

快照隔離
SNAPSHOT ISOLATION level
(SI)

 快照隔離級別使用行版本控制來提供事務級別的讀取一致性。 讀取操作不獲取頁鎖或行鎖,只獲取 SCH-S 表鎖。 讀取其他事務修改的行時,讀取操作將檢索啟動事務時存在的行的版本。 當 ALLOW_SNAPSHOT_ISOLATION 資料庫選項設置為 ON 時,只能對資料庫使用快照隔離。 預設情況下,用戶資料庫的此選項設置為 OFF。

  sql server主要是通過共用鎖申請和釋放機制的不同處理,來實現不同的事務隔離級別。不同隔離級別允許的併發副作用如下:

隔離級別 臟讀 不可重覆讀 幻影讀 併發控制模型
 未提交讀 悲觀
 已提交讀 悲觀
 已提交讀快照 樂觀
 可重覆讀 悲觀
 快照 樂觀
可串列化 悲觀

  不同隔離級別對共用鎖的不同處理方式如下:

隔離級別 是否申請共用鎖 何時釋放 有無範圍鎖
未提交讀  
已提交讀 當前語句做完時
可重覆讀 事務提交時
可序列化 事務提交時

四.事務隔離不同表現

   設置未提交讀 

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

 設置提交讀 

SET TRANSACTION ISOLATION LEVEL READ COMMITTED 

    設置可重覆讀

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ 

   4.1 未提交讀和提交讀與其它事務併發,的區別如下表格:

未提交讀

提交讀

其它事務


SELECT Model FROM Product

WHERE SID=10905

顯示model 值為test


SELECT Model FROM Product 

WHERE SID=10905

顯示model 值為test

begin  tran

update  product set model='test1'

where SID=10905

SET TRANSACTION ISOLATION
LEVEL READ UNCOMMITTED

SET TRANSACTION ISOLATION 

LEVEL READ COMMITTED

 這個事務將model值改為test1.

 此時修改的X鎖未釋放

 

SELECT Model FROM Product

WHERE SID=10905

顯示model值為test1,但這並不正確,

因為其它事務還沒有提交。沒有獲取共用鎖

 

SELECT Model FROM Product

WHERE SID=10905

查詢被阻塞

申請獲取共用鎖時失敗,因為X鎖未釋放

 

  阻塞消失,得到的值還是test

 rollback tran

這裡事務回滾了x鎖釋放值還是test

   4.2  已提交讀和可重覆讀與其它事務併發,的區別如下表格:

已提交讀

可重覆讀 其它事務

SET TRANSACTION ISOLATION
LEVEL READ UNCOMMITTED
begin tran
SELECT Model FROM
ProductWHERE SID=10905
第一次查詢顯示model值為 test

SET TRANSACTION ISOLATION
LEVEL REPEATABLE READ
begin tran
SELECT Model FROM Product
WHERE SID=10905
第一次查詢顯示model值為 test

 

   

begin tran
update product set model='test1'
where SID=10905
將model值改為 test1

另一事務是已提交讀時,這裡事務修改成功
提交讀共用鎖查詢後就釋放。

另一事務是可重覆讀時,這裡事務修改阻塞
可重覆讀共用鎖一直保留到事務提交

SELECT Model FROM Product
WHERE SID=10905
第二次查詢值顯示為 test1

SELECT Model FROM Product
WHERE SID=10905
第二次查詢顯示值顯示為 test

 

commit tran

這裡就是一個事務里多次讀取同一值
結果可能不一致

  commit tran  

   未完...sql server 鎖與事務撥雲見日(下)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.yum install epel-release(安裝epel(Extra Packages for Enterprise Linux)) 2.yum repolist(確保epel添加到yum的源裡邊,如果沒有刪除epel-release重新安裝) 3.yum install nginx(安裝 ...
  • Shell編程之條件語句 學習目標: 掌握shell腳本條件測試 掌握if語句編程 目錄結構: 條件測試 條件測試概述 l 對特定的條件進行判斷,以決定如何執行操作 l 測試的方法 方法1:test 條件表達式 方法2:【條件表達式】 l 當條件成立時,測試語句的返回值為0,否則為其他數值 條件測試 ...
  • 一、現象描述 今天在調試兩台物理機,做完配置重啟主機後,發現一臺伺服器網路無法ssh連接,通過ILO進去ifconfig發現eth0配置的IP地址等信息丟失,手動重啟後,可以ssh連接,但過一段時間,ssh又再次登錄失敗,ifconfig eth0的相關信息也丟失。 二、錯誤原因 centos 6. ...
  • 深圳銳科光電科技有限公司的DALI色溫模塊符合IEC62386-102和IEC62386-207(LED模塊)和IEC62386-209(色溫)標準,同時支持DT6(LED模塊)和DT8(顏色控制-色溫)協議。採用了原裝進口ST單片機晶元,完美相容TRIDONIC(銳高)、OSRAM(歐司朗)、PH... ...
  • druid為各種場景提供了豐富的查詢類型。 查詢由各種JSON屬性組合而成,不同類型的查詢,JSON屬性不同,下麵主要介紹常用的查詢類型。 1. Components Datasources 一個數據源等價於druid表。此外,一個查詢也可以作為數據源,提供類似於子查詢的功能。查詢數據源目前只支持G ...
  • Redis對象類型 Redis基於基礎的數據結構創建的對象: 字元串對象、 列表對象、 哈希對象、 集合對象 有序集合對象。 對象回收:Redis對象系統實現了基於引用計數技術的記憶體回收機制,當程式不再使用某個對象的時候,這個對象所占用的記憶體就會被自動釋放;Redis通過引用計數技術實現了對象共用機 ...
  • 閱讀目錄 1、簡介 2、環境說明 3、主從複製 3.1、MySQL 3.2、配置文件 3.3、開始構建主從複製 3.4、測試主從複製 4、MySql主主複製 4.1、實現原理 4.2、配置文件 4.3、開始構建主主複製 4.4、測試主主複製 5、註意事項 閱讀目錄 1、簡介 2、環境說明 3、主從復 ...
  • WOT大數據處理技術分會場,PingCAP CTO黃東旭、易觀智庫CTO郭煒、Mob開發者服務平臺技術副總監林榮波、宜信技術研發中心高級架構師王東及商助科技(99Click)顧問總監鄭泉五位講師,分別針對時下熱門的HTAP資料庫TiDB、去ETL化的IOTA架構、數據工廠架構、實時敏捷大數據理念實踐 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...