臟讀:對于兩個事物 T1、T2,T1 讀取了已經被 T2 更新但還沒有被提交的字段.。之后, 若 T2 回滾,T1讀取的內容就是臨時且無效的。
不可重復讀:對于兩個事物 T1、T2,T1 讀取了一個字段,然后 T2 更新了該字段。之后,T1再次讀取同一個字段,值就不同了。
幻讀:對于兩個事物 T1、T2,T1 從一個表中讀取了一個字段,然后 T2 在該表中插入了一些新的行。之后,如果 T1 再次讀取同一個表,就會多出幾行.
數據庫系統必須具有隔離并發運行各個事務的能力,使它們不會相互影響,避免各種并發問題。一個事務與其他事務隔離的程度稱為隔離級別。數據庫規定了多種事務隔離級別,不同隔離級別對應不同的干擾程度,隔離級別越高,數據一致性就越好,但并發性越弱。
查看當前mysql數據庫的隔離級別:
設置mysql數據庫禁止自動提交(默認為1):
以下操作都是在test數據庫isolation表中進行:
1、設置數據庫的隔離級別為read uncommitted:
2、開啟兩個事務T1、T2:
T1:
T2:
3、在T2中修改id=00002的name=guanyunchang,不提交在T1中查詢:
T2:
T1:
出現了臟讀問題。
4、T2回滾:
T2:
T1:
1、設置數據庫隔離級別為read committed:
2、開啟兩個事務T1、T2:
T1:
T2:
3、在T2中修改id=00002的name=guanyunchang,不提交在T1中查詢:
T2:
T1:
臟讀問題不存在。
4、T2提交:
T2:
T1:
出現了不可重復讀問題。
1、設置數據庫隔離級別為repeatable read:
2、開啟兩個事務T1、T2:
T1:
T2:
3、在T2中修改id=00002的name=guanyunchang
T2不提交,在T1中查詢:
臟讀問題不存在。
T2提交,在T1中查詢:
不可重復度問題不存在。
4、在T2中插入一條數據id=00004、name=zhugeliang并提交
T2:
T1:
出現幻讀問題。
1、設置數據庫隔離級別為serializable:
2、開啟兩個事務T1、T2:
T1:
T2:
3、在T2中修改id=00003的name=zhangyide:
在事務T1持續期間,不允許T2插入、修改、刪除操作。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com