Isolation Level

上次介紹到 Lock 的特性,主要是要了解資料庫對於資料保護的基本方法,在實務上的運用是要利用 Isolation Level 來做資料存取權限的設定。一般而言,Isolation Level 可以分成四個階層,層級高的功能會涵蓋層級低的功能。

層級名稱說明
0read uncommitted允許讀取尚在作用中的 transaction 異動過的資料,也就是當資料正在被其他 transaction 異動時,也可以讀取該資料。
1read committed只能讀取不在 transaction 中異動的資料,也就是當資料正在被其他 transaction 異動時,就不可以讀取該資料。
2repeatable read在同一個 transaction 中,同樣的 SQL 語法都會得到同樣的結果,也就是當資料被讀取後,其他的 transaction ,不可以 update 或 delete 該資料。
3serialized read在同一個 transaction 中,同樣的 SQL 語法都會得到同樣的結果,也就是當資料被讀取後,其他的 transaction ,不可以 insert、update 或 delete 該資料。

Isolation Level 0 ( read uncommitted )

T1事件說明T2
begin transactionT1、T2 兩個 transaction 同時啟動begin transaction
Update employee Set salary = salary * 1.05T1 正在做調薪的動作 
 T2 讀取 empid 為 A01 的薪資資料Select salary From employee Where empid = 'A01'
 T2 處理結束commit transaction
commit/ rollback transactionT1 處理過程正常 ( commit ),處理過程中有問題,回復到未處理的狀態 ( rollback ) 

當 T2 以 read uncommitted 的方式讀取資料時,所取得的薪資資料,會因為 T1 以 rollback 的方式結束,而取得錯誤的資料。

Isolation Level 1 ( read committed )

T3事件說明T4
begin transactionT3、T4 兩個 transaction 同時啟動begin transaction
Update employee Set salary = salary * 1.05T3 正在做調薪的動作 
 T4 讀取 empid 為 A01 的薪資資料Select salary From employee Where empid = 'A01'
commit/ rollback transactionT4 處理過程正常 ( commit ),處理過程中有問題,回復到未處理的狀態 ( rollback ) 
 T4 處理結束commit transaction

當 T3 以 read committed 的方式讀取資料時,T4 會等到 T3 執行完成 ( commit/ rollback ),再讀取該筆資料,萬一 T4 等太久就會發生 Time Out 的現象。

Isolation Level 2 ( repeatable read )

T5事件說明T6
begin transactionT5、T6 兩個 transaction 同時啟動begin transaction
Select sum ( salary ) From empT5 計算所有的薪資總和 
 T6 更新 empid 為 A01 的薪資Update emp Set salary = salary * 1.10 Where empid = 'A01'
 T6 處理結束commit transaction
Select sum ( salary ) From emp  
commit transactionT5 處理結束 

這裡要特別注意的是,T5 重複讀取相同的資料,但是在處理的過程中,T6 更新了部分的資料,將導致 T5 無法取得相同的資料。

為避免這個問題, T5 在讀取資料時應該採用 Isolation Level 2 的方式,禁止使用 update、delete  的指令,才可以達到所需要的效果。

Isolation Level 3 ( serialized read )

T7事件說明T8
begin transactionT7、T8 兩個 transaction 同時啟動begin transaction
Select sum ( salary ) From empT7 計算所有的薪資總和 
 T8 新增一筆 emp 資料Insert Into emp ( ... ) Values ( ... )
 T8 處理結束commit transaction
Select sum ( salary ) From emp  
commit transactionT7 處理結束 

T7 延續 Isolation Level 2 所產生的問題,當 T8 insert 新的資料進來時,將導致 T7 無法取得相同的資料。

為避免這個問題, T7 在讀取資料時應該採用 Isolation Level 3 的方式,除了禁止使用 update、delete  的指令,同時也禁止使用 insert 的指令,才可以達到所需要的效果。

至於要使用哪一種 Isolation Level,必須視實際上的需要做設定,沒有絕對的處理方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值