MySQL的事務與隔離級別

2021-10-06 05:08:24 字數 1695 閱讀 8252

mysql的隔離級別

1)read uncommitted  可能會出現的問題:髒讀、不可重複讀、幻讀

(讀未提交)此時會出現髒讀    

髒讀:讀取到其他事務未提交的資料

2)read committed(讀已提交) 可能會出現的問題:不可重複讀、幻讀

此時會出現不可重複讀(oracle預設事務隔離級別),平時開發大部分使用此種級別  

3)repeatable read(可重複讀) 可能會出現的問題: 幻讀

此時會出現幻讀(mysql 預設事務隔離級別)

幻讀:在同乙個事務內,讀取不到其他事務已提交的資料,但是當前事務提交之後,在執行相同的查詢語句,會發現跟事務沒提交之前的結果不一致

4)serializable 序列化

給每一行資料加鎖(即給表加鎖),會導致大量的超時現象和鎖競爭

問題描述:

1)髒讀

讀取到其他事務未提交的資料

例如:1.事務1 將某條記錄的age值從20修改為30

2.事務2 讀取了事務1更新後的值:30

3.事務1 回滾,age的值恢復到了20

4.事務2 讀取到的30就是乙個無效的髒資料

2)不可重複讀

讀取到其他事務已提交的資料

例如:1.事務1 讀取了age值為20 

2.事務2 將age值修改為30

3.事務1 再次讀取age值為30,和第一次讀取的不一致

3)幻讀

讀取到其他事務新插入的多條資料

例如:1.事務1 讀取了student表中的一部分資料

2.事務2 向student表中插入了新的行

3.事務1 再次讀取student表時,多出了一些新的行

4)資料庫不可重複讀和幻讀的區別

不可重複讀:事務a第一次讀取資料,事務b對同乙個表進行了update 或者delete,事務a第二次讀取資料,那麼兩次讀取的資料是不同的,這時是不可重複讀。

幻讀:事務a第一次讀取資料,事務b對同乙個表進行了insert,事務a第二次讀取資料,那麼兩次讀取的資料是不同的,這時是幻讀。

重點在於update和delete(鎖行即可解決),insert(需要鎖表解決,即使鎖行之後也無法阻止insert)。

事務:1、原子性(atomicity)

原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響。

2、 一致性(consistency)

一致性是指事務必須使資料庫從乙個一致性狀態變換到另乙個一致性狀態,也就是說乙個事務執行之前和執行之後都必須處於一致性狀態。

拿轉賬來說,假設使用者a和使用者b兩者的錢加起來一共是5000,那麼不管a和b之間如何轉賬,轉幾次賬,事務結束後兩個使用者的錢相加起來應該還得是5000,這就是事務的一致性。

3、隔離性(isolation)

隔離性是當多個使用者併發訪問資料庫時,比如操作同一張表時,資料庫為每乙個使用者開啟的事務,不能被其他事務的操作所干擾,多個併發事務之間要相互隔離。

即要達到這麼一種效果:對於任意兩個併發的事務t1和t2,在事務t1看來,t2要麼在t1開始之前就已經結束,要麼在t1結束之後才開始,這樣每個事務都感覺不到有其他事務在併發地執行。 

4、永續性(durability)

永續性是指乙個事務一旦被提交了,那麼對資料庫中的資料的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作。

MySql事務與隔離級別

事務是由一組sql語句組成的邏輯處理單元,是滿足 acid 特性的一組操作,可以通過 commit 提交乙個事務,也可以使用 rollback 進行回滾。事務具有以下4個屬性,通常簡稱為事務的acid屬性 事務b讀取到了事務a已修改但尚未提交的的資料,還在這個資料基礎上做了操作。此時,如果a事務回滾...

Mysql事務與隔離級別

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

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

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