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

2022-03-18 02:48:30 字數 2079 閱讀 5019

定義:是資料庫操作的最小工作單元,獨立不可分割,要麼都執行、要麼都不執行。

1 、原子性 :強調事務的不可分割。

2 、一致性 :事務開始之前和結束以後,資料庫的完整性約束沒有被破壞。

3 、隔離性 :併發執行的各個事務之間不能互相干擾。 

4 、永續性 :事務一旦提交,資料就持久化到資料庫。

資料庫事務的隔離級別有4種,由低到高分別為read uncommitted 、read committed 、repeatable read 、serializable 。而且,在事務的併發操作中可能會出現髒讀,不可重複讀,幻讀。

a事務b事務

1a事務開啟

2b事務開啟

3a事務讀取資料為1000,並且使用了update,把資料改為2000

4b事務讀取資料為2000

5a事務提交

a事務b事務

1a事務開啟

2b事務開啟

3a事務讀取資料為1000,並且使用了update,把資料改為2000

4a事務提交

5b事務讀取的資料為2000

網上這樣描述:innodb在每行記錄後面儲存兩個隱藏的列來,分別儲存了這個行的建立時間和行的刪除時間。這裡儲存的並不是實際的時間值,而是系統版本號,當資料被修改時,版本號加1。在讀取事務開始時,系統會給當前事務乙個  版本號,事務會讀取版本號<=當前版本號的資料。此時如果其他寫事務修改了這條資料,那麼這條資料的版本號就會加1,從而比當前讀事務的版本號高,讀事務自然而然就讀不到更新後的資料了。

這裡把版本號抽象為列屬性version,便於理解。

iddata

version

11000

01表1   

iddata

version

12000

02表2

a事務b事務

1a事務開啟,讀取id為1且版本號為01的資料

2b事務開啟,讀取id為1且版本號為01的資料

3a事務update了data的資料,data等於2000,這條資料的版本號變為2

4a事務提交

5b事務所獲取的該資料的版本號仍為1,b事務再次讀取資料,結果仍為1000

a和b兩個事務去讀取一條資料,a事務對該條資料進行了修改,b事務恰好讀取到了a修改後的資料,但是a事務並沒有提交,而是在接下來的過程中發生了回滾或者再次修改了這條資料,但是b事務並不知道,那麼可以說b事務讀

取的資料為臟資料,b事務進行了髒讀。

a事務b事務

1a事務開啟

2b事務開啟

3a事務讀取資料為1000,並且update資料為2000

4b事務讀取資料為2000

5a事務發生了回滾,資料重新變成1000

6b事務執行update操作,在2000的基礎上加1000

7提交事務,結果為3000(髒資料)。實際資料應為2000

a和b兩個事務去讀一條資料,b讀取資料後a事務對該條資料進行了修改並提交,當b事務再次讀取這條資料時,發現資料變了。這裡就回答了上面提到的問題,把資料隔離級別設定為讀提交就有可能在併發時出現不可重讀的錯誤。

a事務b事務

1b事務開啟

2a事務開啟

3b事務讀取資料為1000

4a事務執行了update,資料變為2000

5a事務進行了提交

b事務再次讀取資料,資料為2000

注b事務對同一條資料前後讀取了兩次,然而結果卻不同,這就是不可重複讀

a事務b事務

1a事務開啟

2讀取的資料條數為100

3b事務開啟

4新增能加了50條資料

5提交事務

6a事務再次讀取資料條數,發現為150條

注a前後兩次讀取的資料條數不相同,此為幻讀

不可重複度是針對update操作,幻讀是針對insert操作delete操作

髒讀不可重複讀

幻讀讀未提交√√

√讀提交×√

√可重複度××

√序列化××

×

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

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

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

1.髒讀 髒讀就是指當乙個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外乙個事務也訪問這個資料,然後使用了這個資料。e.g.1.mary的原工資為1000,財務人員將mary的工資改為了8000 但未提交事務 2.mary讀取自己的工資 發現自己的工資變為了800...

事務 髒讀 不可重複讀 幻讀

建立db8資料庫 create database db8 使用db8資料庫 use db8 建立賬戶表 create table account id int primary keyauto increment 賬戶id name varchar 20 賬戶名稱 money double 賬戶餘額 ...