SQLSERVER2005行版本控制的使用總結

2021-09-08 06:56:38 字數 2797 閱讀 9579

例子:set transaction isolation level read committed;

begin transaction;

select     *

from         user2

行版本控制隔離:優勢

使用行版本控制的隔離級別具有以下優點:

·         讀取操作檢索一致的資料庫快照。

·         select 語句在讀取操作過程中不鎖定資料(讀取器不阻塞編寫器,編寫器也不阻塞讀取器)。

·         select 語句可以在其他事務更新行時訪問最後提交的行值,而不阻塞應用程式。

·         死鎖的數量減少。

·         事務所需的鎖的數量減少,這減少了管理鎖所需的系統開銷。

·         鎖公升級的次數減少。

行版本控制隔離:原理

sql server 2005的行版本控制原理上很簡單,就是在庫表中每一行的記錄上都悄悄的增加了乙個類時間戳列(行版本列)。

當使用行版本控制的隔離時,sql server 2005 database engine 向使用行版本控制運算元據的每個事務分配乙個事務序列號 (xsn)。

事務在執行 begin transaction 語句時啟動。

但是,事務序列號在執行 begin transaction 語句後的第一次讀/寫操作時開始增加。

事務序列號在每次分配時都增加 1。

當事務執行時,sql server根據行版本列,來提供的行的相應版本。

而sqlserver將維護所有在資料庫中執行的資料修改的邏輯副本(版本)。

特定的事務每次修改行時,資料庫引擎 例項都儲存以前提交的 tempdb 中行的影象版本。

每個版本都標記有進行此更改的事務的事務序列號。

已修改行的版本使用鏈結列表鏈結在一起。

最新的行值始終儲存在當前的資料庫中並鏈結至版 本儲存區 tempdb 中儲存的版本。

(修改大型物件 (lob) 時,只有已更改的片段才會複製到 tempdb 中的版本儲存區, 對於短期執行的事務,已修改行的版本將可能儲存在緩衝池中,而不會寫入 tempdb 資料庫的磁碟檔案中。

如果只是臨時需要副本行,它將只是簡單地從緩衝池中刪除而不會引發 i/o 開銷。)

行版本控制隔離:種類

行版本控制分為兩種已提交讀快照隔離級別(read_committed_snapshot)和快照隔離級別(allow_snapshot_isolation),他們屬於行版本控制的隔離的範疇,但是實際上他們卻有方方面面的不同。

下面是msdn對他們的比較。

屬性

已提交讀快照隔離級別

快照隔離級別

必須設定為

on 以便啟用所需支援的資料庫選項。

read_committed_snapshot

allow_snapshot_isolation

會話如何請求特定型別的行版本控制。

使用預設的已提交讀隔離級別,或執行

set transaction isolation level

語句來指定

read committed

隔離級別。這可以在事務啟動後完成。

需要執行

set transaction isolation level

來在事務啟動前指定

snapshot

隔離級別。

由語句讀取的資料的版本。

在每條語句啟動前提交的所有資料。

在每個事務啟動前提交的所有資料。

如何處理更新。

從行版本恢復到實際的資料,以選擇要更新的行並使用選擇的資料行上的更新鎖。獲取要修改的實際資料行上的排他鎖。沒有更新衝突檢測。

使用行版本選擇要更新的行。嘗試獲取要修改的實際資料行上的排他鎖,如果資料已被其他事務修改,則出現更新衝突,同時快照事務也將終止。

有更新衝突檢測。

無。整合支援。無法禁用。

read_committed_snapshot的強項在於查詢的時候不會下鎖,影響別的事務操作,

而且可以保障查詢的資料滿足絕大多數的精確要求。

snapshot隔離就像真實的快照,它會無視涉及行的變化。在snapshot隔離下執行的事務將讀取資料,然後由另一事務修改此資料。snapshot事務不阻塞由其他事務執行的更新操作,它忽略資料的修改繼續從版本化的行讀取資料。但是,當快照事務嘗試修改已由其他事務修改的資料時,snapshot事務將生成錯誤並終止.

相比read_committed_snapshot,snapshot真正做到了快照隔離,完全無視資料的更新。相對read_committed_snapshot,它更進一步減輕了對鎖的依賴,在效能方面獲得了更大的優勢。不可避免的是,snapshot的事務性也變得更差,但是,至少,它比nolock要好。^_^

snapshot比read_committed_snapshot更快,但是壞訊息是它的限制也多。

1.快照隔離不支援分布式事務,包括分布式分割槽資料庫中的查詢。

2.sql server 不會保留多個版本的系統元資料。表中的資料定義語言 (ddl) 語句和其他資料庫物件(索引、檢視、資料型別、儲存過程和公共語言執行時函式)會更改元資料。如果 ddl 語句修改乙個物件,那麼在快照隔離下對該物件的任何併發引用都將導致快照事務失敗。read_committed_snapshot 資料庫選項為 on 時,已提交讀事務沒有此限制。

3.bulk insert 操作可能會導致對目標表元資料的更改(例如,禁用約束檢查時)。如果出現這種情況,訪問大容量插入表的併發快照隔離事務將失敗。

SQL SERVER 2005版本比較

sql2005 分五個版本,如下所列,1.enterprise 企業版 2.development 開發版 3.workgroup,工作群版 4.standard,標準版 5.express.簡單的比較一下 enterprise,development 和 express 等三個版本 以功能言,en...

SQLSERVER2005行版本控制的使用總結

例子 set transaction isolation level read committed begin transaction select from user2 行版本控制隔離 優勢 使用行版本控制的隔離級別具有以下優點 讀取操作檢索一致的資料庫快照。select 語句在讀取操作過程中不鎖...

SQLSERVER2005行版本控制的使用總結

例子 set transaction isolation level read committed begin transaction select from user2 行版本控制隔離 優勢 使用行版本控制的隔離級別具有以下優點 讀取操作檢索一致的資料庫快照。select 語句在讀取操作過程中不鎖...