sql server 事務隔離性 snapshot 、read committed說明


 一、

 --該 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 ,讀取數據時,可以保證讀操作讀取的行是事務開始時可用的最后提交版本。這意味着這種隔離級別可以保證讀取的是已經提交過的數據,並且可以實現可重復讀,也能確保不會幻讀。

 

 


免責聲明!

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



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