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

第四步:先執行修改腳本,再執行讀取腳本。

修改腳本:依次顯示修改腳本執行狀態和執行結果。

讀取腳本:依次顯示讀取腳本讀取狀態和讀取結果。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM