一、
--該 read committed 默認事務隔離級別 在 systemuser修改事務未完成時 select * from [SystemUser] where id=62; 該語句是不可讀取的 set transaction isolation level read committed; begin transaction update [SystemUser] set LoginId='test' where id=62; waitfor delay '00:00:10' commit transaction; go --可新建查詢窗口 begin transaction readtran select * from [SystemUser] where id=62; commit transaction; 二、 需手動設置 讀提交快照處理打開狀態 設置為true —— 右鍵數據——選項——讀提交快照處理打開狀態 在 allow_snapshot_isolation on 和 set transaction isolation level snapshot ;模式下事務未執行完是可以讀取數據的 -- 開啟快照隔離 --alter database [SimpleFactoring15] set allow_snapshot_isolation on -- 關閉快照隔離 --alter database [SimpleFactoring15] set allow_snapshot_isolation off -- 開啟快照隔離 alter database [SimpleFactoring15] set allow_snapshot_isolation on set transaction isolation level snapshot ; begin transaction update [SystemUser] set LoginId='開啟快照隔離' where id=62; waitfor delay '00:00:10' commit transaction; go --可新建查詢窗口 begin transaction readtran select * from [SystemUser] where id=62; commit transaction;
ead uncommitted | 0 未提交讀
read committed | 1 已提交讀
repeatable read | 2 可重復讀
serializable | 3 可序列化
snapshot 快照(2005版本以后新加)
以下面的圖為例,在事務A中會根據條件讀取TABLE1,且讀兩次,事務B中會對同樣的表TABLE1同樣的條件進行UPDATE,在對表數據更新時會獲得排他鎖直至事務提交,
這樣在事務A中如果設置不同的隔離級別就會有不同的效果。
1、隔離級別設置為read uncommitted,允許臟讀,不管事務B何時Commit,事務A中的SELECT語句2都可以讀出數據(有可能是臟數據,因事務B可能會ROLLBACK),且與語句1的數據不同。
2、隔離級別設置為read committed,不允許臟讀,但允許“不可重復讀”,即事務A中可以多次讀,不管事務B中是否Commit,如果SELECT語句3執行時事務B還沒有Commit,讀取結果與SELECT 語句1相同,反之則不同。
3、隔離級別設置為repeatable read,不允許臟讀,也不允許“不可重復讀”,但允許”幻讀“,示例中,事務A中的SELECT語句3的執行一定要等到事務B Commit之后才能執行成功。
4、隔離級別設置為serializable,這是最高級別的隔離,串行化讀,事務只能一個一個執行,避免了臟讀、不可重復讀、幻讀。
5、隔離級別設置為snapshot ,讀取數據時,可以保證讀操作讀取的行是事務開始時可用的最后提交版本。這意味着這種隔離級別可以保證讀取的是已經提交過的數據,並且可以實現可重復讀,也能確保不會幻讀。