面试题答案
一键面试常见导致死锁的操作场景
- 并发事务对相同资源的交叉访问:
- 例如事务 A 先获取资源 X 的锁,接着尝试获取资源 Y 的锁;而事务 B 先获取资源 Y 的锁,然后尝试获取资源 X 的锁。如果这两个事务同时进行,就可能形成死锁。比如在银行转账场景中,两个账户间相互转账,若两个事务分别先锁定自己转出账户再尝试锁定对方转出账户就可能死锁。
- 锁的持有时间过长:
- 事务长时间持有锁而不释放,同时其他事务也在请求这些锁,容易导致死锁。比如一个事务在进行复杂计算或等待外部资源(如网络调用)时一直持有数据库锁,其他事务无法获取锁资源,当有多个事务存在这种等待关系时,可能引发死锁。
- 不同事务按不同顺序获取锁:
- 假设有事务 T1、T2、T3,T1 按顺序获取锁 L1、L2、L3,T2 按顺序获取锁 L2、L3、L1,T3 按顺序获取锁 L3、L1、L2。在并发执行时,不同事务获取锁顺序的混乱可能导致死锁。
- 批量操作中的锁竞争:
- 当多个事务同时对一批数据进行插入、更新或删除操作时,如果锁的粒度设置不合理,可能会造成死锁。例如在一个电商库存管理系统中,多个事务同时对一批商品库存进行修改操作,若没有合理控制锁的范围和获取顺序,就可能出现死锁。
初步评估死锁发生概率的方法
- 分析业务逻辑和并发情况:
- 如果业务场景中并发事务频繁且对相同资源有交叉访问需求,死锁发生概率较高。例如电商秒杀活动,大量并发订单操作对库存资源的竞争,死锁概率相对较大。相反,一些业务操作并发量低且资源访问独立,死锁概率低。
- 检查锁的使用模式:
- 若事务长时间持有锁,或者获取锁顺序不一致,死锁概率会增加。通过分析代码中锁的获取和释放逻辑,评估死锁可能性。例如查看事务内锁的持有时间是否过长,不同事务获取锁的顺序是否混乱等。
- 监控数据库运行状态:
- 利用数据库监控工具(如 MySQL 的 SHOW ENGINE INNODB STATUS 命令)查看当前锁等待情况。如果经常出现锁等待,且等待关系复杂,死锁发生概率增大。例如在高并发时段,频繁出现锁等待且等待事务之间存在交叉等待关系,预示着死锁发生概率较高。