事務隔離級別二三事

2021-08-25 08:30:11 字數 912 閱讀 2769

如果你是乙個資料庫設計者,你會如何考慮資料庫的事務設計呢?

首先,我們要明確事務的四個基本特性:acid,在此處就不多作介紹,這已經是大部分程式設計師爛在嘴巴裡的四個字母。我們需要考慮的是,打破這個四個特性的情況和行為,以及如何防範和取捨。

髒讀,不可重複讀,幻讀。

先說說髒讀,取名為髒讀,自然是有髒資料,才導致的髒讀,那麼什麼是髒資料,而什麼又導致了髒資料呢?

假設事務a將資料d由20改為30,這時事務b讀取資料d,得到的資料將會是30,而後事務a回滾,此時,資料d就是髒資料,事務a的回滾導致了髒資料的產生。

不可重複讀,指的是一次事務在兩個時間段讀到的同一資料不同,這又是如何導致的呢?

假設事務a讀取了資料d,此時事務b進來,修改了資料d,事務a再次讀取資料d時,就會發生不可重複讀。

幻讀,是乙個很奇葩的名字。

假設事務a對全表資料進行修改,將每一行的字段d修改為20,而此時事務b插入一條欄位d為30的記錄,事務會發現表中有乙個奇葩,好像出現了幻覺一樣。

事務有對應著四種不同級別的事務隔離級別,層層遞進,以解決上文所說的三種問題。

事務隔離級別一共有:讀未提交,讀已提交,可重複讀,序列讀。之前說到過mysql有多種儲存引擎,innodb儲存引擎就是乙個支援事務的儲存引擎。在oracle和sqlserver中,預設的事務隔離級別是讀已提交,而mysql的預設事務隔離級別則是可重複讀,這大概也是mysql慢於大多數資料庫的原因吧(i guess)。

這四種隔離級別都是挺顧名思義的。首先說說讀未提交,讀未提交指的是,事務可以讀取其他事務未提交的資料,如此一來很顯然的會有概率造成以上所有的問題。

再就是讀已提交,讀已提交,指的是事務只能讀取已經提交的資料,這樣子可以防止髒讀發生。

可重複讀,可重複讀是對不可重複讀的一種解決。

序列化,則是將所有的事物排序,對共享資源加鎖,由此解決以上所有的問題。

事務隔離級別

1 serializable 最嚴格的spring事務隔離級別,事務序列執行,資源消耗最大 3 read committed 大多數主流資料庫的預設spring事務隔離等級,保證了乙個事務不會讀到另乙個並行事務已修改但未提交的資料,避免了 髒讀取 該級別適用於大多數系統。4 read uncommi...

事務隔離級別

四種隔離級別 隔離級別 髒 讀不可重複讀取 幻 像讀操作未提交 read uncommitted 是是 是讀操作已提交 read committed 否是 是可重複讀 repeatable read 否否 是快照否否 否可序列讀 serializable 否否 否 sql server 還支援使用行...

事務隔離級別

需要防止的現象和事務隔離級別 ansi iso sql 標準 sql92 定義了四種事務隔離級別 transaction isolation level 這四種隔離級別所能提供的事務處理能力各不相同。這些事務隔離級別是針對三種現象定義的,在併發事務執行時,需要阻止這三種現象 中的一種或多種發生。三種...