」可重複讀「隔離級別下MySQL是如何解決幻讀問題的

什麼是幻讀?

幻讀,在一個事務裏面的兩次相同過濾條件的讀取,讀取的數據數條數不一致。(注意和不可重複讀的區別)數據庫

MySQL的默認隔離級別是RR,可是卻沒有幻讀的問題,那他是怎麼解決的呢?答案就是Gap鎖。spa

隔離級別 髒讀 不可重複讀 幻讀
Read Uncommitted 可能 可能 可能
Read Committed 不可能 可能 可能
Repeat Read 不可能 不可能 可能(MySQLInnoDB不可能)
串行化 不可能 不可能 不可能

MySQL的Gap鎖

MySQL的共享鎖(讀鎖)和排它鎖(寫鎖)你們應該都比較熟悉了,那gap鎖是什麼東西呢?版本控制

select *from user where age>0 and age<10 for update;
或者
select *from user where age>0 and age<10;
或者
select *from user where age>0 and age<10 in share mode;

舉個栗子,咱們在一個事務中執行上述的SQL語句,數據庫中只有age=1,age=4,age=7,age=8 這三條知足條件的記錄,那麼gap鎖會加到age=2,3,5,6,9上面,若是另一個事務裏面想insert age=2,3,5,6,9 是會被阻塞的,由於第一個事務拿到了gap鎖。code

 

MySql中若是是快照讀,那麼是經過MVCC(多版本控制)來避免幻讀.事務

若是是當前讀,那麼是經過gap鎖來避免幻讀ci

相關文章
相關標籤/搜索