MySQL的事務隔離級別

2021-09-27 08:45:14 字數 1221 閱讀 9549

一、事務的原則

事務要滿足acid原則,也就是:

1.原子性(atomicity):事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程**錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是乙個不可分割的整體。

2.一致性(consistency):事務開始前和結束後,資料庫的完整性約束沒有被破壞 。比如a向b轉賬,不能出現a扣了錢,b卻沒收到。

3.隔離性(isolation):同一時間,只允許乙個事務請求同一資料,不同的事務之間彼此沒有任何干擾。比如a正在從一張銀行卡中取錢,在a取錢的過程結束前,b不能向這張卡轉賬。

4.永續性(durability):事務完成後,事務對資料庫的所有更新將被儲存到資料庫,不能回滾。

二、事務併發造成的問題

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

事務b把使用者的年齡更新成22歲,但是事務還未提交。此時事務a來讀使用者的年齡,讀到了22歲,然後去做自己的處理。之後事務b把使用者的年齡回滾到21歲。這個例子中事務a讀到的22歲就是髒資料。

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

事務b先把使用者的餘額更新為100元,事務a來讀的時候讀到的是100元,然後事務b又把餘額更新為90元,此時事務a來讀的時候讀到的就是90元,也就是事務a讀到的資料前後不一致。

3.幻讀:事務a對錶中的資料進行了修改,涉及到表中的全部行。同時,事務b也修改這個表中的資料,向表中插入一行新資料。那麼,事務a發現表中還有自己沒有修改的行,就好象發生了幻覺一樣。比如:

a先把所有人的餘額清零,同時,b往表中插入了一條餘額為100的資料。a提交以後,發現竟然還有100的。就好像發生了幻覺一樣,這就叫幻讀。

三、mysql的事務隔離級別

mysql的事務隔離級別有四種:

1.讀未提交(read-uncommitted):能讀到未提交的資料。會出現髒讀、不可重複讀、幻讀。

2.讀已提交(read-committed):讀已提交的資料。會出現不可重複讀和幻讀。

3.可重複讀(repeatable-read):mysql預設的事務隔離級別,查詢的都是事務開始時的資料。只會出現幻讀。

4.序列讀(serializable):完全序列化讀,每次都會鎖表,讀寫互相阻塞。最高隔離級別,不會出現髒讀,不可重複讀,幻讀。但會大大影響系統的效能,一般不用。

mysql隔離級別 MySQL 事務隔離級別

mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...

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

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

MySQL事務隔離級別

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