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