幻讀,在一個事務裏面的兩次相同過濾條件的讀取,讀取的數據數條數不一致。(注意和不可重複讀的區別)數據庫
MySQL的默認隔離級別是RR,可是卻沒有幻讀的問題,那他是怎麼解決的呢?答案就是Gap鎖。spa
隔離級別 | 髒讀 | 不可重複讀 | 幻讀 |
Read Uncommitted | 可能 | 可能 | 可能 |
Read Committed | 不可能 | 可能 | 可能 |
Repeat Read | 不可能 | 不可能 | 可能(MySQLInnoDB不可能) |
串行化 | 不可能 | 不可能 | 不可能 |
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