1. 程式人生 > >SQLServer之建立資料庫快照

SQLServer之建立資料庫快照

建立資料庫快照注意事項

語法:set transaction isolation level snapshot;

指定事務中任何語句讀取的資料都將是在事務開始時便存在的資料的事務上一致的版本。 事務只能識別在其開始之前提交的資料修改。 在當前事務中執行的語句將看不到在當前事務開始以後由其他事務所做的資料修改。 其效果就好像事務中的語句獲得了已提交資料的快照,因為該資料在事務開始時就存在。

除非正在恢復資料庫,否則 SNAPSHOT 事務不會在讀取資料時請求鎖。 讀取資料的 SNAPSHOT 事務不會阻止其他事務寫入資料。 寫入資料的事務也不會阻止 SNAPSHOT 事務讀取資料。

在資料庫恢復的回滾階段,如果嘗試讀取由其他正在回滾的事務鎖定的資料,則 SNAPSHOT 事務將請求一個鎖。 在事務完成回滾之前,SNAPSHOT 事務會一直被阻塞。 當事務取得授權之後,便會立即釋放鎖。

必須將 ALLOW_SNAPSHOT_ISOLATION 資料庫選項設定為 ON,才能開始一個使用 SNAPSHOT 隔離級別的事務。如果使用 SNAPSHOT 隔離級別的事務訪問多個數據庫中的資料,則必須在每個資料庫中將 ALLOW_SNAPSHOT_ISOLATION 都設定為 ON。

不能將通過其他隔離級別開始的事務設定為 SNAPSHOT 隔離級別,否則將導致事務中止。 如果一個事務在 SNAPSHOT 隔離級別開始,則可以將它更改為另一個隔離級別,然後再返回 SNAPSHOT。 事務在第一次訪問資料時啟動。

在 SNAPSHOT 隔離級別下執行的事務可以檢視由該事務所做的更改。 例如,如果事務對錶執行 UPDATE,然後對同一個表發出 SELECT 語句,則修改後的資料將包含在結果集中。

在快照隔離模式下,事務中任何語句讀取的 FILESTREAM 資料都將是在事務開始(而非語句開始)時便存在的資料的事務性一致版本。

使用T-SQL指令碼建立資料庫快照

第一步:開始一個讀取會話和修改會話。

讀取會話指令碼:

--宣告資料庫使用
use testss;
go

--開啟修改會話
begin transaction updatetran
update test1 set name='資料庫快照' where id='1';


waitfor delay '00:00:10';
commit transaction
go

修改會話指令碼:

--宣告資料庫使用
use testss;
go

--建立讀取會話
begin transaction readtran
select * from test1 where id='1';
commit transaction;
go

第二步:首先執行讀取會話指令碼,檢視讀取結果並記錄,方便與快照開啟之後讀取結果進行對比。

第三步:修改讀取會話指令碼。

--宣告資料庫使用
use testss;
go

--開啟資料庫快照隔離
--alter database testss set allow_snapshot_isolation on;

--關閉資料庫快照隔離
--alter database testss set allow_snapshot_isolation off;

--設定事務隔離級別
set transaction isolation level snapshot;

--建立讀取會話
begin transaction readtran
select * from test1 where id='1';
commit transaction;
go

第四步:先執行修改指令碼,再執行讀取指令碼。

修改指令碼:依次顯示修改指令碼執行狀態和執行結果。

讀取指令碼:依次顯示讀取指令碼讀取狀態和讀取結果。

第五步:結果分析:首先執行修改指令碼,在修改指令碼執行期間立即執行讀取指令碼,讀取程序沒有阻塞,直接讀取到了修改事務開始之前的資料,當修改指令碼執行完畢之後,再次執行讀取指令碼,讀取程序並未發生阻塞,事務修改完成讀取結果和事務修改執行期間讀取結果不同,這說明資料庫快照只能讀取事務開始之前和結束之後的狀態。