MySQL中的存儲引擎是指MySQL實現(xiàn)數(shù)據(jù)存儲和檢索的方式,而InnoDB是其中的一種存儲引擎。與MyISAM引擎相比,InnoDB引擎支持更好的并發(fā)性和更好的事務管理能力。在InnoDB中,行鎖是實現(xiàn)并發(fā)控制的重要一環(huán)。
事務1: START TRANSACTION; SELECT * FROM table WHERE id=1 FOR UPDATE; UPDATE table SET status=1 WHERE id=1; COMMIT; 事務2: START TRANSACTION; SELECT * FROM table WHERE id=1 FOR UPDATE; UPDATE table SET status=2 WHERE id=1; COMMIT;
InnoDB引擎的行鎖是在語句執(zhí)行的時候進行的,因此在上述例子中,當事務1執(zhí)行SELECT語句并獲得id為1這一行的鎖時,事務2就無法繼續(xù)執(zhí)行SELECT語句。只有當事務1釋放了鎖后,事務2才可以獲取鎖并繼續(xù)執(zhí)行。由此可見,InnoDB引擎的行鎖可以保證并發(fā)控制的正確性。
同時,InnoDB引擎的行鎖是基于索引的。因此,在執(zhí)行UPDATE或DELETE等操作時,如果沒有提供關鍵字,InnoDB引擎需要掃描整個表的所有行,而這會導致鎖的粒度變大,從而影響到并發(fā)能力。因此,在使用InnoDB引擎時,需要合理地設計索引,以便實現(xiàn)更好的并發(fā)性。