全文大約【1505】字,不說廢話,只講可以讓你學到技術、明白原理的純干貨!本文帶有豐富案例及配圖視頻,讓你更好的理解和運用文中的技術概念,并可以給你帶來具有足夠啟迪的思考......
一. 事務隔離級別
什么是事務隔離級別呢?對我們的日常操作結果又有什么影響呢?下面小編帶各位小伙伴先來了解下事務隔離級別的概念。
1.隔離級別的概念
多個客戶端操作時 ,各個客戶端的事務之間應該是隔離的,相互獨立的 , 不受影響的。
如果多個事務操作同一批數據時,則需要設置不同的隔離級別 , 否則就會產生問題 。
2.四種隔離級別
我們先來了解一下四種隔離級別的名稱 , 再來看看可能出現的問題。
3.可能引發(fā)的問題
下面小編總結了數據庫中不同事務隔離級別可能引發(fā)的問題。各位小伙伴可以參照下。
4.數據庫隔離級別操作語法
查詢數據庫隔離級別:
語法:SELECT @@TX_ISOLATION;
修改數據庫隔離級別:
語法:SET GLOBAL TRANSACTION ISOLATION LEVEL 級別字符串;
5.事務隔離級別演示
舉個栗子:臟讀的問題。
-- 查詢賬戶表
select * from account;
-- 設置隔離級別為read uncommitted
set global transaction isolation level read uncommitted;
-- 開啟事務
start transaction;
-- 轉賬
update account set money = money - 500 where id = 1;
update account set money = money + 500 where id = 2;
-- 窗口2查詢轉賬結果 ,出現臟讀(查詢到其他事務未提交的數據)
-- 窗口2查看轉賬結果后,執(zhí)行回滾
rollback;
舉個栗子:解決臟讀的問題和演示不可重復讀的問題。
-- 設置隔離級別為read committed
set global transaction isolation level read committed;
-- 開啟事務
start transaction;
-- 轉賬
update account set money = money - 500 where id = 1;
update account set money = money + 500 where id = 2;
-- 窗口2查看轉賬結果,并沒有發(fā)生變化(臟讀問題被解決了)
-- 執(zhí)行提交事務。
commit;
-- 窗口2查看轉賬結果,數據發(fā)生了變化(出現了不可重復讀的問題,讀取到其他事務已提交的數據)
舉個栗子:解決不可重復讀的問題。
-- 設置隔離級別為repeatable read
set global transaction isolation level repeatable read;
-- 開啟事務
start transaction;
-- 轉賬
update account set money = money - 500 where id = 1;
update account set money = money + 500 where id = 2;
-- 窗口2查看轉賬結果,并沒有發(fā)生變化
-- 執(zhí)行提交事務
commit;
-- 這個時候窗口2只要還在上次事務中,看到的結果都是相同的。
-- 只有窗口2結束事務,才能看到變化(不可重復讀的問題被解決)
6.隔離級別總結
注意:隔離級別從小到大安全性越來越高,但是效率越來越低 , 所以不建議使用READ UNCOMMITTED 和 SERIALIZABLE 隔離級別。
二. 結語
小編在這里對本文核心要點進行總結:
1.理解臟讀、幻讀、不可重復讀產生的原因和解決辦法。
2.各位小伙伴熟練記住不同隔離級別以及會導致的問題。