MySQL有哪些行鎖,是如何解決幻讀的? 行鎖根據互斥的緯度可以分為: 1、共享鎖:當讀取當一行記錄時為了防止別人修改則需要添加S鎖。 2、排他鎖:當修改一行記錄時為了防止別人同時進行修改則需要添加X鎖。 根據鎖定的范圍可以分為: 1、間隙鎖:間隙鎖鎖定范圍是索引記錄之間的間隙或者第一個或最后一個索引記錄之前的間隙(指虛擬最大記錄) 2、記錄鎖:MySQL中記錄鎖都是添加在索引上,即使表上沒有索引也會在隱藏的聚集索引上添加記錄鎖。 3、next-key lock:Next-Key Locks是Record Locks與Gap Locks間隙鎖的組合,也就是索引記錄本身加上 之前的間隙。間隙鎖防止了保證RR級別下不出現幻讀現象會,防止同一個事務內得 到的結果不一致。 4、插入意向鎖:插入意向鎖定是在行插入之前由INSERT操作設置的一種間隙鎖。這個鎖表示插入的意圖,即插入相同索引間隙的多個事務如果不插入間隙內的相同位置則不需要等待彼此,插入意向鎖是一種特殊的GAP LOCK。 如何解決幻讀的: 1、MySQL在RR隔離級別引入gap lock,把2條記錄中間的gap鎖住,避免其他事務寫入(例如在二級索引上鎖定記錄1-3之間的gap,那么其他會話無法在這個gap間插入數據) 2、MySQL出現幻讀的條件是隔離級別<=RC,或者innodb_locks_unsafe_for_binlog=1(8.0已取消該選項)