面试题答案
一键面试死锁场景1:循环依赖
- 场景描述:事务A锁定资源X,尝试锁定资源Y;同时,事务B锁定资源Y,尝试锁定资源X。由于双方都持有对方所需资源且都不释放,从而形成死锁。例如,有两个表
orders
和customers
,事务1先对orders
表中的某条记录加锁,然后尝试对customers
表中相关记录加锁;事务2先对customers
表中的某条记录加锁,接着尝试对orders
表中相关记录加锁。 - 避免方法:统一事务获取锁的顺序。比如所有涉及
orders
和customers
表操作的事务,都先锁定customers
表,再锁定orders
表。这样就不会出现循环依赖的情况。
死锁场景2:高并发更新同一行数据
- 场景描述:多个事务同时对同一行数据进行更新操作。例如,在一个电商系统中,多个用户同时抢购同一商品,每个事务都要更新商品库存。由于MySQL的行锁机制,当多个事务竞争锁时,若处理不当就可能导致死锁。
- 避免方法:可以在业务层面引入排队机制,将并发操作转化为顺序操作。比如使用消息队列,每个更新库存的请求先进入队列,依次处理,避免多个事务同时竞争锁。或者采用乐观锁,在更新数据时先检查数据版本,只有版本号一致才进行更新,减少锁竞争导致的死锁。