1. 程式人生 > >mysql事務之提交讀(Read Committed)

mysql事務之提交讀(Read Committed)

1,Read Commited定義:

在提交讀(READ COMMITTED)級別中,基於鎖機制併發控制的DBMS需要對選定物件的寫鎖(write locks)一直保持到事務結束,但是讀鎖(read locks)在SELECT操作完成後馬上釋放(因此“不可重複讀”現象可能會發生,見下面描述)。和前一種隔離級別一樣,也不要求“範圍鎖(range-locks)”。
簡而言之,提交讀這種隔離級別保證了讀到的任何資料都是提交的資料,避免讀到中間的未提交的資料,髒讀(dirty reads)。但是不保證事務重新讀的時候能讀到相同的資料,因為在每次資料讀完之後其他事務可以修改剛才讀到的資料。
提交讀保證我們讀到的資料都是事務提交後的資料,這樣子就保證了程式中資料的正確性,在我們的應用中,基本都是使用的Read Commited隔離級別。

2,場景

我們首先設定我們的資料庫事務級別為提交讀,開啟事務1,對student表做更新,但是不對其提交,再開啟事務2對資料進行讀取。

start TRANSACTION;
select * from student;
update student set name = 'a1' where id = 1;
select * from student;
在該事務中,更新資料後,我們檢視student表,其中的資料已經發生了變化。我們開啟事務2對資料查詢。

select * from student;
在該事務中查詢到的student還是舊資料,對事務1進行提交,再在事務2中查詢,資料則獲取到的為我們最新的資料。

再次期間事務2和事務1中讀取資料,事務1未提交時兩個讀取的資料不一致,可能發生不可重複讀。