InnoDB行鎖是通過鎖定索引記錄來實現(xiàn)的。具體實現(xiàn)方式如下:
當(dāng)事務(wù)A需要對某一行記錄加鎖時,InnoDB會在該行對應(yīng)的索引上加上記錄鎖。
如果該行已經(jīng)被其他事務(wù)加了鎖,則事務(wù)A會等待。
當(dāng)事務(wù)A需要訪問被其他事務(wù)鎖定的行時,如果事務(wù)A的隔離級別是可重復(fù)讀(REPEATABLE READ),InnoDB會生成該行的一個快照,并返回舊的行給事務(wù)A。
當(dāng)事務(wù)A釋放鎖時,InnoDB會將鎖從索引上移除。
需要注意的是,InnoDB行鎖的實現(xiàn)方式是基于索引的,所以如果沒有使用索引或者使用了全表掃描,那么行鎖會升級為表鎖來保證數(shù)據(jù)的一致性。此外,由于InnoDB行鎖是基于索引的,所以在使用行鎖時,應(yīng)該根據(jù)具體的業(yè)務(wù)場景來選擇合適的索引,以避免鎖競爭和死鎖問題的發(fā)生。