事務 事務的隔離級別,以及髒讀 不可重複讀 幻讀

2021-10-04 10:17:30 字數 2138 閱讀 2581

- 什麼是事務?

/**

事務,即資料庫事務。是資料庫管理系統執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。

通常,事務的正確執行會使資料庫從一種狀態轉換為另一種狀態。

*/

- 事務的特性(acid原則)

/**

原子性(atomicity) 即不可分割性,事務要麼全執行、要麼全不執行。

一致性(consistency) 事務的執行使得資料庫從一種正確狀態轉換成另外一種正確狀態。

隔離性(isolation) 在事務正確提交之前,不允許把事務對該資料的改變提供給任何其他事務。

永續性(durability) 事務正確提交之後,其結果將永遠儲存在資料庫之中。

*/

- 併發狀態下事務會產生的問題:

/**

併發狀態解釋為當事務a和事務b對同一資源進行操作時,可能會遇到很多的問題。

*/

/**

即事務a讀到了事務b還沒有提交的資料。如果事務a對資料進行了更新,

但是事務a並沒有提交,但是事務b這個時候看到了事務a沒有提交的更新。

當事務a進行了回滾,那麼剛剛事務b看到的資料就是髒資料。也就是髒讀。

例子:  a 給 b 轉了100萬,但是 a 還沒有提交,此時 b 查詢自己賬戶,多了100萬。

然後 a 發現轉錯人了,回滾了事物。然後 b 100萬就沒了。

在這個過程中 b 查到了沒有提交的資料(多出的100萬),這就是髒讀。

*/

/**

即同一事務在事務執行過程中對同乙個資料進行了多次讀取,

但是每一次讀取的資料結果都不相同。原因是在兩次讀取間隔,

資料別其他人修改了,導致了統一事務兩次讀取結果不一致。

例子:  a 查詢銀行餘額為100萬,b 這個時候取走了50萬,此時餘額變成了50萬,

a 再一次查詢餘額,變成了50萬。對 a 而言兩次結果不一致就是不可重複讀。

*/

/**

即在事務 a 多次讀取資料集的過程中中,

事務 b 對資料進行了新增操作或者刪除操作,

導致事務 a 多次讀取的資料集不一致。

例子:  a 修改當前公司所有職員資訊的時候,b 向其中插入了乙個新的職員,

這個時候 a 提交的時候發現了乙個自己沒有修改過的職員的資訊,

對 a 而言就像是產生了幻覺。

*/

- 事務的隔離級別:

/**

為了應對上面併發情況下出現的問題,事務的隔離級別就產生了。

當事務的隔離級別越高的時候,上面的問題就會越少,

但是效能消耗也會越大。所以在實際生產過程中,要根據需求去確定隔離級別。

*/

/**

讀未提交,即能夠讀取到沒有被提交的資料,

所以很明顯這個級別的隔離機制無法解決髒讀、不可重複讀、幻讀中的任何一種。

*/

/**

已提交,即能夠讀到那些已經提交的資料,能夠防止髒讀,

但是無法解決不可重複讀和幻讀的問題。

*/

/**

重複讀取,即在資料讀出來之後加鎖,類似"select * from *** for update",

明確資料讀取出來就是為了更新用的,所以要加一把鎖,防止別人修改它。

repeatable_read的意思也類似,讀取了一條資料,這個事務不結束,

別的事務就不可以改這條記錄,這樣就解決了髒讀、不可重複讀的問題,

但是幻讀的問題還是無法解決。

*/

/**

序列化,最高的事務隔離級別,不管多少事務,

挨個執行完乙個事務的所有子事務之後才可以執行另外乙個事務裡面的所有子事務,

這樣就解決了髒讀、不可重複讀和幻讀的問題了。

*/

MySQL事務隔離級別以及髒讀 幻讀 不可重複讀

事務的隔離性 mysql是乙個客戶端 伺服器架構的軟體,對於同乙個伺服器來說,可以有若干個客戶端與之連線,每個客戶端與伺服器連線上之後,就可以稱之為乙個會話 session 每個客戶端都可以在自己的會話中向伺服器發出請求語句,乙個請求語句可能是某個事務的一部分,也就是對於伺服器來說可能同時處理多個事...

事務 隔離級別 髒讀 不可重複 幻讀

事務,就是一組運算元據庫的動作集合。如果一組 處理步驟 全部發生或者一步也不執行,我們稱該組處理步驟為乙個事務。當所有的步驟像乙個操作一樣被完整地執行,我們稱該事務被提交。由於其中的一部分或多步執行失敗,導致沒有步驟被提交,則事務必須回滾到最初的系統狀態。二 事務的併發問題 1 髒讀 事務 a讀取了...

事務隔離級別 髒讀 spring 測試

建立乙個controller,寫兩個url,用於測試髒讀 一 testcontroller autowired private testservice testservice responsebody apiimplicitparams apioperation value listfordirty...