事務提交讀註意事項 語法:set transaction isolation level read committed。 資料庫預設的是兩個會話事務之間是提交讀。 READ COMMITTED指定語句不能讀取已由其他事務修改但尚未提交的數據。 這樣可以避免臟讀。 其他事務可以在當前事務的各個語句之間 ...
事務提交讀註意事項
語法:set transaction isolation level read committed。
資料庫預設的是兩個會話事務之間是提交讀。
READ COMMITTED指定語句不能讀取已由其他事務修改但尚未提交的數據。 這樣可以避免臟讀。 其他事務可以在當前事務的各個語句之間更改數據,從而產生不可重覆讀取和虛擬數據。 該選項是 SQL Server 的預設設置。
READ COMMITTED 的行為取決於 READ_COMMITTED_SNAPSHOT 資料庫選項的設置:
如果將 READ_COMMITTED_SNAPSHOT 設置為 OFF(預設設置),則 資料庫引擎會使用共用鎖防止其他事務在當前事務執行讀取操作期間修改行。 共用鎖還會阻止語句在其他事務完成之前讀取由這些事務修改的行。 共用鎖類型確定它將於何時釋放。 行鎖在處理下一行之前釋放。 頁鎖在讀取下一頁時釋放,表鎖在語句完成時釋放。
如果將 READ_COMMITTED_SNAPSHOT 設置為 ON,則 資料庫引擎會使用行版本控製為每個語句提供一個在事務上一致的數據快照,因為該數據在語句開始時就存在。 不使用鎖來防止其他事務更新數據。
使用T-SQL腳本創建提交讀
第一步:開啟一個修改會話和一個讀取會話。
修改會話腳本:
--聲明資料庫引用
use testss;
go
--開始事務
begin transaction readtran
update test1 set name='事務提交讀' where id='1';
waitfor delay '00:00:10';
commit transaction;
go
讀取會話腳本:
--聲明資料庫引用
use testss;
go
--開啟事務
begin transaction trans
select * from test1 where id='1';
commit transaction;
go
第二步:首先執行讀取會話腳本,查看並記錄讀取結果,為提交讀作比較。
第三步:首先不添加隔離級別查看數據讀取結果,先執行修改會話,在執行讀取會話。
修改會話:依次顯示修改執行狀態和執行結果。
讀取會話:依次顯示執行狀態和執行結果。
第四步:(未設置會話隔離級別)結果分析:首先執行修改後會話,然後立即執行讀取會話,中間會有兩秒的點擊時間間隔,等待兩個事物都執行完畢查看執行結果,修改會話使用了10s,讀取會話使用了8s(中間有兩秒的點擊時間差),讀取會話在修改會話完成後順利讀取到了修改結果,與第二步結果執行查詢的結果不同。
第五步:在讀取會話設置隔離級別,重新運行第三步,結果與第四步分析一直。
讀取會話腳本:
--聲明資料庫引用
use testss;
go
--設置會話隔離級別
set transaction isolation level read committed;
--開啟事務
begin transaction trans
select * from test1 where id='1';
commit transaction;
go