建立乙個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 每個客戶端都可以在自己的會話中向伺服器發出請求語句,乙個請求語句可能是某個事務的一部分,也就是對於伺服器來說可能同時處理多個事...