事務隔離級別 髒讀 spring 測試

2021-08-07 06:37:38 字數 3018 閱讀 4569

建立乙個controller,寫兩個url,用於測試髒讀

(一)testcontroller

@autowired

private testservice testservice;

@responsebody

@apiimplicitparams({})

@apioperation(value="listfordirtyread")

public object index()

@responsebody

@apiimplicitparams({})

@apioperation(value="insertfordirtyreadandillusion")

public void insertfordirtyreadandillusion()

testservice

@service

public class testservice

@transactional

public void insertfordirtyreadandillusion () catch (interruptedexception e)

int a = 1/0;

}}

注意:

(1)此時insert函式也啟用事務,意味著整個函式一起提交會話

(2)list函式啟用read_committed級別,理論上可以防髒讀

會話1執行insertfordirtyreadandillusion

會話1睡眠阻塞

會話2在10s內反覆執行listfordirtyread,始終返回空

會話1返回,插入回滾

會話2最後一次查詢,返回空

結論:與理論相符

(二)

@service

public class testservice

@transactional

public void insertfordirtyreadandillusion () catch (interruptedexception e)

int a = 1/0;

}}

注意:

(1)這邊乙個小改動,將list隔離級別定義為 read_uncommitted,理論上無法防髒讀

(2)insert保留為事務,乙個函式為乙個會話一起commit,意味著在sleep的過程中,理論上會有髒讀

會話1執行insertfordirtyreadandillusion

會話1睡眠阻塞

會話2在10s內反覆執行listfordirtyread,始終返回[ ]

會話1返回,插入回滾

會話2最後一次查詢,返回空

結論:與理論相符,在事務insert阻塞的10s內,出現了未提交的資料

(三)

@service

public class testservice

public void insertfordirtyreadandillusion () catch (interruptedexception e)

int a = 1/0;

}}

注意:(0)本案例考察service層不加事務標籤時,jdbc的會話情況

事務情況下:jdbc  遵循  setautocommit(false)   ...   try commit catch rollback  

非事務情況下:mysql 預設自動提交

(1)insert函式改為非事務,意味著一句sql即為一次會話,理論上我們無法在sleep過程中去再現髒讀

(2)list函式改為  read_commited,為避免髒讀創造條件,假設insert事務在sleep時未提交,理論上則不應出現髒讀

會話1執行insertfordirtyreadandillusion

會話1睡眠阻塞

會話2在10s內反覆執行listfordirtyread,始終返回[ ]

證明sql已經作為乙個會話提交,sleep並未產生延遲放大會話的作用

會話1返回,插入未回滾

會話2最後一次查詢,返回[ ]

結論:與理論相符,sql作為單獨一次會話提交,在sleep時,會話2查詢即使在防髒讀級別下也讀到了「髒讀」(實際不算髒讀,是sql單次會話提交的資料)

總結:(一)

修改方            查詢方

thread                   a                     b

transcation          on               on(僅為了定義隔離級別,無關是否定義為一次會話)                             

isolation           not care       read-commited

無髒讀(二)

修改方            查詢方

thread                   a                     b

transcation          on               on(僅為了定義隔離級別,無關是否定義為一次會話)                             

isolation           not care       read-uncommited

有髒讀(三)

修改方            查詢方

thread                   a                     b

transcation          off               on(僅為了定義隔離級別,無關是否定義為一次會話)                             

isolation           not care       read-commited

在防髒讀read-commited情況下讀到了資料,反證了no transaction的會話為sql單獨一次會話,sql後的sleep並沒有延長會話

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

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

mysql 隔離級別 髒讀 測試

修改方 查詢方 session a b autocommit off not care 修改方是為了開啟事務 isolation not care read uncommited為邊界 執行順序 左側開啟一次會話 左側第一次insert 右側第一次select 自動提交會話 顯示讀到髒讀 左側rol...

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

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