经典面试:MySQL的锁机制,表级锁和行级锁的使用场景及解决方案
表级锁:开销小,加锁快;不会出现死锁;锁粒度大,发生锁冲突的概率最高,并发度最低。适用于以SELECT和INSERT为主的应用,比如CMS(内容管理系统)后台。
行级锁:开销大,加锁慢;会出现死锁;锁粒度最小,发生锁冲突的概率最低,并发度最高。适用于UPDATE和DELETE为主的应用,如在线事务处理(OLTP)系统。
解决方案:
- 选择合适的锁粒度:如果业务逻辑中需要频繁地锁定少量行,使用行级锁更为合适。
- 考虑死锁:确保在事务中以相同的顺序访问表和行,以减少死锁的可能性。
- 控制事务大小:保持事务简短和快速,以减少锁持有时间。
- 使用合适的锁策略:可以通过设置锁等待超时参数来避免长时间等待锁释放,或者使用乐观锁等非锁定策略。
示例代码(MySQL):
-- 表级锁
LOCK TABLES table_name READ; -- 为读操作加表级锁
INSERT INTO table_name ...
UNLOCK TABLES;
-- 行级锁
START TRANSACTION;
SELECT * FROM table_name WHERE id = 1 FOR UPDATE; -- 为更新操作加行级锁
UPDATE table_name SET ... WHERE id = 1;
COMMIT;
在实际应用中,通常会根据实际需求和业务场景选择合适的锁粒度和策略,以达到最佳的性能和并发效果。
评论已关闭