資料庫事物隔離級別

2021-09-01 12:30:10 字數 1165 閱讀 6040

事物隔離級別:

1、序列化 serializable  單位時間,只有乙個事物,強制事物排序,並行度低,效能差

2、可重複讀 repeatable read   讀操作可以並行,同乙個事物裡,所有讀操作的結果都是事物開始時的狀態(一致性), 但可以增加新的記錄,mysql 預設事物隔離級別

3、讀已提交(read commited 不可重複讀),讀鎖公升級為寫鎖

乙個事務執行乙個查詢,讀取了大量的資料行。由於讀鎖可以被寫鎖公升級,所以在它結束讀取之前,另乙個事務可能完成了對資料行的更改。當第乙個事務試圖再次執行同乙個查詢,伺服器就會返回不同的結果,這就是「不可重複讀」。

4、讀未提交(read uncommited)

隔離級別最低,同時也是並行度最高、效能最好的隔離級別。當然也存在很大的問題,就是「髒讀」。所謂「髒讀」就是事務a修改了一行,另乙個事務b也可以讀到該行。如果第乙個事務a執行了回滾,那麼事務b讀取的就是從來沒有正式出現過的值,也就是前面提到的讀取到中間狀態資料

還有一點需要說明的是在mvcc併發控制中,讀操作可以分成兩類:快照讀 (snapshot read)與當前讀 (current read)。快照讀,讀取的是記錄的可見版本 (有可能是歷史版本),不用加鎖。當前讀,讀取的是記錄的最新版本,並且當前讀返回的記錄,都會加上鎖,保證其他事務不會再併發修改這條記錄。

快照讀:簡單的select操作,屬於快照讀,不加鎖:

select * from  table where  a=?;

當前讀:特殊的讀操作,插入/更新/刪除操作,屬於當前讀,需要加鎖。

select * from  table  where  a=? lock in  share mode;

select * from table where a=? for update;

insert into table values (…);

update table set a=? where b=?;

delete from table where a=?;

所有以上的語句,都屬於當前讀,讀取記錄的最新版本。並且,讀取之後,還需要保證其他併發事務不能修改當前記錄,對讀取記錄加鎖。

其中,除了第一條語句,對讀取記錄加s鎖 (共享鎖)外,其他的操作,都加的是x鎖 (排它鎖)。

mysql鎖是基於索引,所以如果update where沒有走索引,會導致全表掃瞄,相當於表鎖

資料庫事物隔離級別

資料庫事物的隔離級別有4個,由低到高依次為 1.read uncommitted 兩個併發的事務,事務b讀取了事物a尚未提交的資料,出現髒讀。2.read committed 事務a事先讀取了資料,事務b緊接更新了資料,並提交了事務,而事務a再次讀取該資料時,資料已發生了改變,即所說的不可重複讀。3...

資料庫事物的隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...

MySQL資料庫事物隔離級別

mysql資料庫事物隔離級別 隔離級別 髒讀不可重複讀 幻讀讀未提交 read uncommitted 是是 是讀已提交 read committed 否是 是可重複讀 repeatable read 預設 否否 是序列化 serializable 否否 否1 不可重複讀 針對同一資料,兩次讀取的結...