隔離級別對並發插入的影響
REPEATABLE READ 是InnoDB 的默認隔離級別。帶唯一搜索條件使用唯一索引的SELECT ... FOR UPDATE, SELECT ... LOCK IN SHARE MODE, UPDATE 和DELETE 語句只鎖定找到的索引記錄,而不鎖定記錄前的間隙。用其它搜索條件,這些操作采用next-key 鎖定,用next-key 鎖定或者間隙鎖定鎖住搜索的索引范圍,並且阻止其它用戶的新插入。
在持續讀中,有一個與READ COMMITTED 隔離級別重要的差別:在這個級別,在同一事務內所有持續讀讀取由第一次讀所確定的同一快照。這個慣例意味著如果你在同一事務內發出數個無格式SELECT 語句,這些SELECT 語句對相互之間也是持續的。
READ COMMITTED 隔離級別是一個有些象Oracle 的隔離級別。所有SELECT ...FOR UPDATE 和SELECT ... LOCK IN SHARE MOD 語句僅鎖定索引記錄,而不鎖定記錄前的間隙,因而允許隨意緊挨著已鎖定的記錄插入新記錄。UPDATE 和DELETE 語句使
用一個帶唯一搜索條件的唯一的索引僅鎖定找到的索引記錄,而不包括記錄前的間隙。
在范圍類型UPDATE 和DELETE 語句,InnoDB 必須對范圍覆蓋的間隙設置next-key鎖定或間隙鎖定以及其它用戶做的塊插入。這是很必要的,因為要讓MySQL 復制和恢復起作用,“幽靈行”必須被阻止掉。
如果應用是從基於Oracle 的應用遷移到MySQL 數據庫的,那麼建議使用該隔離級別提供數據庫服務,因為該隔離級別是最接近Oracle 的默認隔離級別的,遷移可能遇到的鎖問題最小。