資料庫中事務的隔離級別 小結

2021-06-09 15:03:29 字數 1451 閱讀 9806

對於同時執行的多個事務, 當這些事務訪問資料庫中相同的資料時, 如果沒有採取必要的隔離機制, 就會導致各種併發問題:  

針對上述四種狀況,設計了四種隔離級別:

隔離級別

更新丟失

髒讀不可重複讀

幻讀read uncommitted

-可能發生

可能發生

可能發生

read committed--

可能發生

可能發生

repeatable read--

-可能發生

anomaly serializable--

--read uncommitted(允許讀到尚未提交的資料)  :  允許事務讀取未被其他事務提交的變更,髒讀、不可重複讀和幻讀的問題都會出現  

read commited(只能讀到已提交資料)  : 只允許事務讀取已經被其他事務提交的變更,可以避免髒讀,但不可重複讀和幻讀問題仍然會出現  

repeatable read(事務內重複讀同一塊資料保持不變) :  確保事務可以多次從乙個欄位中讀取相同的值,在這個事務持續期間,禁止其他事務對這個字段進行更新,可以避免髒讀和不可重複讀,但幻讀的問題依然存在  

serializable(事務逐個序列操作)  : 確保事務可以從乙個表中讀取相同的行,在這個事務持續期間,禁止其他事務對該錶執行插入、更新和刪除操作,所有併發問題都可以避免,但效能十分低。

隔離級別

寫入鎖讀取鎖

範圍鎖read uncommittedv-

-read commitedvs

-repeatable readvv

-serializablevv

v "v" 排他鎖。鎖定將持續到事務結束。

"s" 共享鎖。一般寫鎖都是排他的,否則連最低的事務隔離級別都無法保證,會出現更新丟失(lost update)的情況。讀鎖有共享讀鎖和排他讀鎖之分,兩者都要等待對應範圍的寫鎖被釋放後才能獲取,以避免讀到髒資料;區別是s僅在讀取完成後即釋放,而無需等到事務結束,且支援同時被多個讀操作持有(意即共享)。顯然前者鎖定的粒度更小,因而效能較優。

oracle 支援的 2 種事務隔離級別:read commited, serializable. oracle 預設的事務隔離級別為: read commited   

mysql 支援 4 中事務隔離級別. mysql 預設的事務隔離級別為: repeatable read  

對「更新丟失」的描述不到位,在「解決方案」中錯誤地使用了「瞬間共享讀鎖」和「共享讀鎖」。

沒有提到「更新丟失」的情況,在read uncommitted中沒有提到其保證不出現更新丟失。隔離級別的翻譯較繁體的意譯更直觀

英文維基,一貫得準確和可靠。中文版「隔離級別與鎖定」(isolation levels vs locks)一節是錯誤的,順手改了下。

5.1.2.1. isolation levels 寫得簡單、直觀、到位。嚴重推薦。

oracle官方文件。

資料庫事務隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...

資料庫事務隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...

資料庫事務隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable 這四個級別可以逐個解決髒讀 不可重複讀 幻讀 這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted re...