理解MySQL的事務

2021-10-08 02:11:48 字數 1332 閱讀 2935

事務解決的問題:轉賬問題。

甲向乙轉賬1000元

執行步驟:1、甲的賬戶 - 1000      2、乙的賬戶 + 1000

如果執行第一步之後,第二步出現問題,此時資料就發生了錯誤。

事務就是把一組操作打包在一起,執行的時候能夠保證這些操作之間滿足一定的特性,避免出現上面的問題。

事務的特性:

1、原子性:乙個事務是乙個不可分割的單位。要麼全部執行,要麼全都不執行。(本質上是通過回滾方式來實現)。

2、一致性:事務處於執行前後,資料處於合法狀態。

3、永續性:事務執行完畢之後,資料就被持久修改了。(寫到磁碟裡了)

4、隔離性:多個事務併發執行時,事務之間不能相互干擾。(本質上是執行緒安全問題)

隔離性和併發是相悖的,如果多個事務之間,隔離性越強,併發程度就越低;隔離性越弱,併發程度就越高,效率就越高。

隔離是為了保證資料的準確,併發是為了提高效率。

併發執行事務時產生的問題。

1、髒讀。

如果乙個事務a正在修改資料(還未提交),事務b事務讀取了這裡的修改內容,此時這樣的事務b讀操作就是髒讀。因為事務a在提交資料之前,隨時可能修改剛才的資料。

解決方案:寫操作加鎖,寫的時候,不能讀。事務a在修改資料的過程中(提交之前),事務b嘗試讀,就會阻塞,一直阻塞到事務a提交資料之後,事務b才能讀到資料。

引入寫加鎖,事務的併發程度和效率降低,隔離性提高。

2、不可重複讀。

事務a內部兩次讀取同乙個資料,發現資料不一樣(讀的資料過程中另一事務修改了資料),就叫不可重複讀。

解決方案:讀也加鎖。之前寫加鎖是指修改資料的時候,不能讀取資料,但事務b讀取資料的時候,事務a還可以修改資料。讀加鎖:事務b讀取資料的時候,事務a不能修改資料。

引入讀加鎖,事務的併發程度就更低了,效率也更低了,隔離性更高。

3、幻讀

一次事務執行過程中,兩次讀取到的結果集不一樣(具體的資料結果不一樣)。

解決方案:序列化,讓修改操作與讀操作徹底穿行執行,a修改時b不可以讀,b讀時a不可以修改。

此時的併發程度最低,效率也最低,但是資料的可靠性最高。

只要是併發程式設計,都會有這些問題。

mysql的隔離級別。

1、read uncommitted:允許讀取未提交的資料(隔離程度最低,併發性最高,有髒讀)。

2、read committed:只允許讀取已經提交的資料,相當於寫加鎖(隔離性提高一些,併發性降低,解決髒讀,有不可重複讀)。

3、repeatable read:mysql預設級別,給讀也加鎖(隔離性又提高,併發性降低,解決不可重複讀,會有幻讀問題)。

4、serializable:嚴格序列化執行(隔離性最高,併發最低,解決幻讀)。

mysql 事務的理解

mysql 執行事務操作 1.原子性 乙個事務包含多個操作,這些操作要麼全部執行,要麼全都不執行。實現事務的原子性,要支援回滾操作,在某個操作失敗後,回滾到事務執行之前的狀態。2.一致性 執行事務操作,比如轉賬,兩個人互相轉賬 不管轉多少次,錢的總數額是不會改變的。3.永續性 事務提交後,就是對資料...

mysql事務隔離性的理解

事務是對一組操作原子性的保障,但正是由於事務,就會出現事務a和事務b資料之間的可見性問題 髒讀,幻讀,不可重複讀 為了解決問題,才設定了隔離級別這種東西 隔離級別的一種實現思想就是mvcc,一行資料由於多個事務的修改可能會有多個版本。每次讀取的是資料最新版本。事務之間不是併發執行的。事務在每次執行語...

MySQL原理解讀 事務

資料庫事務有4個屬性,我們叫它們acid,分別為原子性 一致性 隔離性和永續性 1.1 原子性 atomicity 乙個事務內的操作是不可分割的,要麼都成功,要麼都失敗 事務把資料從乙個正確的狀態遷移到另乙個正確的狀態 併發事務相互隔離 多個事務之間的操作過程不可見 資料是持久化儲存的 比如存到磁碟...