MySQL四種事務隔離級別和死鎖

2021-09-25 11:38:46 字數 1689 閱讀 7609

乙個事務必須被視為乙個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾,對於乙個事務來說,不可能只執行其中的一部分操作,這就是事務的原子性。

資料庫總是從乙個一致性的狀態轉換到另外乙個一致性的狀態。就比如,乙個事務中,某乙個語句執行成功了,後面的執行失敗了,最壞的狀態也是回滾的。

通常來說,乙個事務所做的修改在最終提交以前,對其他事務是不可見的

一旦事務提交,則其所做的修改就會永久儲存到資料庫中。

1. 髒讀:事務a讀取了事務b更新的資料,然後b回滾操作,那麼a讀取到的資料是髒資料

2. 不可重複讀:事務 a 多次讀取同一資料,事務 b 在事務a多次讀取的過程中,對資料作了更新並提交,導致事務a多次讀取同一資料時,結果 不一致。

3. 幻讀:系統管理員a將資料庫中所有學生的成績從具體分數改為abcde等級,但是系統管理員b就在這個時候插入了一條具體分數的記錄,當系統管理員a改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。

小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表

事務隔離級別

髒讀不可重複讀

幻讀加鎖讀

讀未提交(read-uncommitted)是是

是no不可重複讀(read-committed)否是

是no可重複讀(repeatable-read)否否

是no(版本控制)

序列化(serializable)否否

否yes

死鎖是指兩個或者多個事務在同一資源上相互占用,並請求鎖定對方占用的資源,從而導致惡性迴圈的現象。當多個事務試圖以不同的順序鎖定資源時,就可能會產生死鎖。

事務1

start transaction;

update stockprice set close = 45.50 where stock_id = 4 and date = '2002-05-01';

update stockprice set close = 19.80 where stock_id = 3 and date = '2002-05-02';

commit;

事務2

start transaction;

update stockprice set high = 20.12 where stock_id = 3 and date = '2002-05-02';

update stockprice set high = 47.20 where stock_id = 4 and date = '2002-05-01';

commit;

如果湊巧,兩個事務都執行了第一條update語句,更新了一行資料,同時也鎖定了該行資料,接著每個事務都嘗試去執行第二條update語句,卻發現該行已經被對方鎖定,然後兩個事務都等待對方釋放鎖,同時又持有對方需要的鎖,則陷入死迴圈。除非有外部因素介入才可能解除死鎖。

innodb目前處理死鎖的方法是,將持有最少行級排他鎖的事務進行回滾(這是相對比較簡單的死鎖回滾演算法)

死鎖發生以後,只有部分或者完全回滾其中乙個事務,才能打破死鎖。對於事務型的系統,這是無法避免的,所以應用程式在設計時必須考慮如何處理死鎖。大多數情況下只需要重新執行因死鎖回滾的事務即可。

mysql的四種隔離級別

參考書籍《高效能mysql第三版》第一章

MySQL 四種事務隔離級別

mysql 事務都是指在 innodb 引擎下,myisam 引擎不支援事務。顯而易見,能夠讀取到,其他事務未提交的資料。既然其他事務未提交,就代表資料可能會回滾,這也意味著,可能讀取到的資料根本就不存在。特點 能讀取其它事務未提交的資料。存在事務問題 髒讀,不可重複讀,幻讀 這個隔離級別,只能讀取...

事務四種隔離級別

1.讀取未提交 乙個事務可以讀取另乙個未提交的事務的資料。髒讀 2.讀取已提交 事務a多次讀取同一資料,事務b在事務a多次讀取的過程中,對資料做了更新並提交,導致事務a多次讀取同一資料時,結果不一致。不可重複度 對應update操作 3.可重複讀 開始讀取資料時 事務開啟時 不在允許修改操作。可能會...

MySQL的四種事務隔離級別

一 事務的基本要素 acid 1 原子性 atomicity 事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是乙個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。2 一致性 co...