MySQL事務,事務隔離級別詳解

2022-01-30 11:37:36 字數 2567 閱讀 5252

1、什麼是事務指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。

2、事務的4個特性原子性(atomicity)、一致性(consistency)、隔離性(isolation)、永續性(durability)。

3、每個特性的意思

。原子性原子性是指事務是乙個不可再分割的工作單位,事務中的操作要麼都發生,要麼都不發生。

如,a向b轉錢,在事務中的扣款和加款兩條語句,要麼都執行,要麼都不執行。

。一致性一致性是指事務使得系統從乙個一致的狀態轉換到另乙個一致狀態。

如,a和b存款總額為1000,a向b轉錢,無論失敗,最終a和b的存款總額依然為1000.

。隔離性多個事務併發訪問時,事務之間是隔離的,乙個事務不應該影響其它事務執行效果。

資料庫多個事務之間操作可能出現的問題以及事務隔離級別是這篇文章介紹的重點。

。永續性永續性,意味著在事務完成以後,該事務所對資料庫所作的更改便持久的儲存在資料庫之中,並不會被回滾。

即使出現了任何事故比如斷電等,事務一旦提交,則持久化儲存在資料庫中。

4、事務併發產生的問題。髒讀(dirty read)乙個事務讀取到了另外乙個事務沒有提交的資料

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

。不可重複讀(nonrepeatable read)在同一事務中,兩次讀取同一資料,得到內容不同

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

。幻讀(phantom read)同一事務中,用同樣的操作讀取兩次,得到的記錄數不相同

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

5、mysql的4種隔離級別

。read uncommitted(讀取未提交內容)

在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。

讀取未提交的資料,則會發生贓讀

。read committed(讀取提交內容)

乙個事務只能看見已經提交事務所做的改變。這是大多數資料庫系統的預設隔離級別,但非mysql

乙個事務多次讀取的過程中,另乙個事務可能對同一條資料做修改並提交,導致前乙個事務多次讀取到的資料不一致,則會發生不可重複讀

。repeatable read(可重讀)

它確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行。這是mysql的預設隔離級別

但,此級別依然會發生幻讀

。serializable(可序列化)

它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題

隔離級別

讀資料一致性

贓讀不可重複讀

幻讀read uncommitted

最低級別,只能保證不讀取物理上損壞的資料√√

√read committed

語句級×√√

repeatable read

事務級××√

serializable

最高端別,事務級××

×

總結。事務用來管理 insert,update,delete 語句

。事務處理可以用來維護資料庫的完整性,保證成批的 sql 語句要麼全部執行,要麼全部不執行

。在 mysql 中只有使用了 innodb 資料庫引擎的資料庫或表才支援事務。

。低階別的隔離一般支援更高的併發處理,並擁有更低的系統開銷。高階別的隔離可靠性較高,但系統開銷較大。

。mysql中預設事務隔離級別是可重複讀時並不會鎖住讀取到的行。

。事務隔離級別為讀提交時,寫資料只會鎖住相應的行。

。事務隔離級別為可重複讀時,如果有索引(包括主鍵索引)的時候,以索引列為條件更新資料,會存在間隙鎖間隙鎖、行鎖、下一鍵鎖的問題,從而鎖住一些行;如果沒有索引,更新資料時會鎖住整張表

。事務隔離級別為序列化時,讀寫資料都會鎖住整張表

。隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大,魚和熊掌不可兼得啊。對於多數應用程式,可以優先考慮把資料庫系統的隔離級別設為read committed,它能夠避免髒讀取,而且具有較好的併發效能。儘管它會導致不可重複讀、幻讀這些併發問題,在可能出現這類問題的個別場合,可以由應用程式採用悲觀鎖或樂觀鎖來控制。

參考

僅供自己 溫故而知新

mysql事務隔離級別詳解 事務的隔離級別詳解

事務的隔離級別 在資料庫操作中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別。問題的提出 資料庫是要被廣大客戶所共享訪問的,那麼在資料庫操作過程中很可能出現以下幾種不確定情況。更新丟失 兩個事務都同時更新一行資料,乙個事務對資料的更新把另乙個事務對資料的更新覆蓋了。這是因為系統沒有執行任何的...

MySQL事務隔離級別詳解

sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因...

MySQL事務隔離級別詳解

sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因...