SQL Server 2005事務隔離級別與效能

2021-06-18 12:58:59 字數 3841 閱讀 3596

**:

眾所周知,sql server事務隔離級別是為了保證在併發事務處理環境下的資料完整性,準確性,一致性的一種機制。在sql

server2005中一共有五種事務隔離級別,分別為:read uncommitted,read committed,repeatable read,snapshot,serializable.正

確的在事務中應用隔離界別可以保證資料的準確,本文的意圖不在於如何正確的將事務隔離界別應用到不同的需求邏輯實現中,而是

想說明一些有關使用事務隔離級別時應該考慮的效能因素從而構建具有良好效能的事務體系。

一 事務隔離級別介紹

sql server 2005通過鎖機制和行版本控制來實現事務隔離級別機制。下面簡單介紹一下各種不同的事務隔離級別以及將他們應用到

事務中時sql server的內部實現。

read uncommited

read uncommited級別是限制最低的隔離級別,當read uncommitted被應用到事務時,事務中的查詢將不會在資料庫物件上應用任何

鎖(包括共享鎖)相當於使用了no lock提示的select語句。所以當使用這個隔離級別的時候,將不會阻止其他的事務讀或者寫當前

事務請求的資料。由於這種特性,導致應用read committed的事務存在讀取其他事務修改但並未提交的資料(髒讀)。

read committed

read cmmitted級別是sql server的預設事務隔離級別。它可以避免事務中的查詢讀取被修改但並未提交的資料(避免髒讀)。read

committed有兩種實現方式,這取決於read_committed_snapshot資料庫選項的設定情況。當read_committed_snapshot為on時,資料

庫引擎將會通過行版本控制為事務中的每乙個查詢建立乙個事務級的資料快照。資料快照包含在執行查詢前的所有符合查詢條件的數

據。使用這種方法將不會對資料庫物件應用任何資料庫鎖(當然,可以使用readcommittedlock提示強制查詢語句使用鎖)。如果

read_committed_snapshot為off時,資料庫引擎將在執行查詢時,對資料庫物件應用共享鎖來避免其他事務修改當前事務中正在執行

的查詢語句所訪問的物件。

因為在事務中各查詢的間隔期間,其他事務可以修改資料庫物件,所以使用read committed級別時有可能出現不可重複讀或幻象讀的

情況。repeatable read

repeatable read在read committed的基礎上,延長了執行查詢時對訪問的資料應用的共享鎖的週期。在每次執行查詢時,都要對數

據庫物件應用共享鎖並且在整個事務結束前不會釋放共享鎖,從而避免了在事務間隔期間其他事務修改當前事務訪問的資料物件(避

免不可重複讀)。但是其他事務可以執行insert語句對當前事務訪問的物件執行插入操作,因此幻象讀的情況仍然不可避免。

serializable

serializable是最嚴格的隔離級別,與repeatable相比,應用這個隔離級別的事務將會在訪問資料上加range鎖,其他事務將不能在

資料庫物件上修改或者插入任何資料。range鎖也會被一直占用直到整個事務結束(相當於select語句的holdlock查詢提示)。使用

這個隔離級別可以避免幻象資料。

snapshot

snapshot隔離級別會為事務中的所有查詢語句建立事務級的資料快照,資料快照包含開始事務前的所有已經提交的資料。這種模式同

樣利用了行版本控制機制。注意,使用snapshot隔離級別時雖然不會阻塞其他事務執行,但是有乙個例外,當rollback操作執行時,

如果事務請求被其他事務正在rollback的資料時鎖住的資料,當前事務會被阻塞知道其他事務釋放他們所占用的鎖。

二 事務隔離級別的系統開銷

由於資料庫鎖機制和行版本控制都要占用系統資源,並且資料庫鎖的占用和釋放將會影響到併發事務處理的響應速度和資料庫死鎖,

所以在使用事務隔離級別時要考慮到不同的應用和各種不同隔離級別的系統開學情況。

read uncommitted

可以提供最好的系統效能。原因在於使用read committed隔離界別的事務將不對為查詢請求任何的資料庫鎖,資料庫鎖管理占用的資

源幾乎為0,同時當前被執行的事務不會影響到其他事務的正確執行,可以確保併發事務的相應時間,從而大大提高系統的整體效能

。提供最好的效能必然有最大的弊端,髒讀,不可重複讀,幻想資料等情況都會在這種情況下發生。

read committed

如果使用所機制實現read committed隔離,將會對事務中查詢的目標資料庫物件加共享鎖。如果使用行版本控制模式,則對系統主要

影響在於資料庫引擎需要提供額外的資源來管理資料快照。所有的資料快照將被儲存在資料庫的tempdb中,所以當訪問大量資料時,

需要考慮io子系統的吞吐量以及tempdb是否有充分的空間來維護資料庫例項中所有資料庫的行版本請求,已經其他涉及tempdb的操作

。此外,資料庫伺服器的處理器系統和快速儲存系統也將承受更大的負載。

repeatable

在事務執行過程中一直占用資料庫物件的鎖資源將會導致其他事務在當前事務執行過程中被永久性阻塞。如果當前事務中存在長時間

的操作且沒有系統沒有超時處理機制,將會嚴重影響事務處理的響應速度,甚至出現資料庫死鎖。由於在repeatable事務隔離級別下

,其他事務可以對當前事務訪問的資料庫物件執行插入操作,將不會影響併發的插入操作(但需要在幻象資料與效能之間進行權衡)

serializable

盡量避免使用的隔離級別,應用該隔離級別的事務將完全阻塞其他需要訪問當前事務正在訪問的資料庫物件的事務。在併發運算元量

龐大時,即使事務處理響應速度較快,也會大大降低系統整體響應速度。

三 應用

事務隔離級別的應用是在應用與效能之前的權衡,一下是我本人對於不同型別的應用與不同事務隔離級別結合的一些觀點,僅供參考

read uncommitted

適合在大型資料倉儲系統oltp與olap之間的資料轉換(etl)時使用,由於資料倉儲中儲存的資料是一段時間內的資料,並且大量的

資料用來對趨勢作分析,所以對於資料的精確性要求比較低。在etl執行過程中,可能會遍歷大量的oltp系統資料,查詢將會消耗很

長的時間,如果長時間占用資料庫物件並阻塞其他事務的更新或插入操作,將對oltp系統造成巨大影響。如果etl執行時間在系統離

線狀態下進行,則無須考慮。

read committed/snapshot

可以滿足大部分一般應用,但仍然需要盡量減小事務中的查詢響應時間。同時還應考慮在使用行版本控制模式下,查詢大量資料對系統資源的影響。

repeatable

在一些修改操作比較頻繁的系統中,當事務需要對相同的結果集進行多次不連續的處理時,需要應用repeatable隔離級別。要盡量將

事務中訪問的資料庫物件降低到最少,以緩解阻塞其他事務而造成的壓力。

serializable

謹慎使用!特別是併發數量很大的系統,切忌使用該事務隔離級別。

四 結論

提高事務執行的效能可以有很多方法,比如優化查詢,建立適當的索引等等。將效能作為乙個因素加入合理使用事務隔離級別的範疇

內並不是必要的,但是如果大家能在實踐中盡量去考慮這些因素,那麼將構建出更優質的系統。

SQL Server2005複製實現

一 準備工作 1 在發布伺服器上建立乙個共享目錄,作為發布快照檔案的存放目錄。例如 在d 盤根目錄下建資料夾名為pub 2 設定sql 發布伺服器和訂閱伺服器均設定 步驟 開啟服務 控制面板 管理工具 服務 右擊sqlserver agent 屬性 登入 選擇 此帳戶 輸入或選擇第一步中建立的win...

SQL Server 2005完全解除安裝

sql server 2005的解除安裝是乙個非常頭疼的問題。我曾經嘗試過直接使用 新增或刪除程式 工具解除安裝 清除安裝目錄 刪除登錄檔內容等等各種方式綜合解除安裝,勉強成功。現在終於找到了乙個事半功倍的方法,多次嘗試,未有失敗,具體如下 第一種是微軟官方提供的工具 msicuu2.exe 微軟官...

SQLSERVER 2005 遞迴查詢

專案中有使用者組表usergroup如下 其中pid表示當前組的上級組 表資料如下 現在想查詢出頂級組 沒有上級組叫頂級組 a1組的所有子孫組id,sql如下 查詢子節點 with rtd1 as select id pid from usergroup rtd2 as select from rt...