1. 程式人生 > >Mysql隔離級別

Mysql隔離級別

tms rep 介紹 let tro ted mage toc 時間

Mysql提供了4中隔離級別,在介紹這4中隔離級別前,先針對涉及的術語進行說明:

1》、臟讀:一個事務讀取另外一個事務還沒有提交的數據叫臟讀針對未提交的數據

2》、不可重復讀:即在同一個事務內,兩個相同的查詢返回了不同的結果讀取數據本身的對比

  案例:設置事務的隔離級別讀提交:set session transaction isolation level read committed; 查看事務隔離級別:select @@tx_isolation;

    設置自動提交:SET AUTOCOMMIT=0;

    表tms_message_info數據:

    ID file_name

1 1111.SND

2 2222.SND

事務A READ-COMMITTED 事務B READ-COMMITTED

start transaction;

select * from tms_message_info where id=‘1‘

start transaction;-- 開啟事務

update tms_message_info set FILE_NAME=‘666.SND‘ where ID=‘1‘; 未提交

B事務未提交前,A事務執行上述查詢,得到的文件名結果為1111.SND commit; B 事務提交
B事務提交後,A事務在執行查詢,結果發生變化,文件名變為666.SND,即同一事務查詢結果不同,即不可重復讀

3》、幻讀:即解決了不重復讀,保證了同一個事務裏,查詢的結果都是事務開始時的狀態(一致性),因此同一個事務同樣的SELECT操作讀到的結果會是一致的,但是,如果另一個事務同時提交了新數據或刪除數據,本事務再更新時,就會“驚奇的”發現了這些新增或缺少數據,貌似之前讀到的數據是“鬼影”一樣的幻覺【同一事務A多次查詢,若另一事務B只是update,則A事務多次查詢結果相同;若B事務insert/delete數據,則A事務多次查詢就會發現新增或缺少數據,出現幻讀,即幻讀關註讀取結果集條數變化

1、讀不提交(Read Uncommited,RU)

這種隔離級別下,事務間完全不隔離,會產生臟讀,可以讀取未提交的記錄,實際情況下不會使用。

2、讀提交(Read commited,RC)

本事務讀取到的是最新的數據(其他事務提交後的)。問題是,在同一個事務裏,前後兩次相同的SELECT會讀到不同的結果(不重復讀)

3、可重復讀(Repeatable Read,RR)【MySQL 默認的級別】

在同一個事務裏,SELECT的結果是事務開始時時間點的狀態,因此,同一個事務同樣的SELECT操作讀到的結果會是一致的。但是,會有幻讀現象

4、 串行化(SERIALIZABLE)。讀操作會隱式獲取共享鎖,可以保證不同事務間的互斥

技術分享

隔離級別越高,並發性越差

Mysql隔離級別