創建資料庫快照註意事項 語法:set transaction isolation level snapshot; 指定事務中任何語句讀取的數據都將是在事務開始時便存在的數據的事務上一致的版本。 事務只能識別在其開始之前提交的數據修改。 在當前事務中執行的語句將看不到在當前事務開始以後由其他事務所做的 ...
創建資料庫快照註意事項
語法: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
第四步:先執行修改腳本,再執行讀取腳本。
修改腳本:依次顯示修改腳本執行狀態和執行結果。
讀取腳本:依次顯示讀取腳本讀取狀態和讀取結果。