面试题答案
一键面试死锁产生原因
- 资源竞争:多个事务同时尝试获取相同的Redis锁和MySQL资源(如行锁、表锁等),且获取顺序不一致。例如,事务A先获取了Redis锁,接着尝试获取MySQL的资源X;事务B先获取了MySQL的资源Y,接着尝试获取Redis锁。若资源X和Y相互依赖,就可能产生死锁。
- 加锁顺序不一致:不同事务以不同顺序对Redis锁和MySQL资源进行加锁,形成循环依赖,导致死锁。比如事务1按照先Redis锁1再MySQL锁2的顺序加锁,事务2按照先MySQL锁2再Redis锁1的顺序加锁。
解决死锁的方法 - 超时机制
- 方法描述:在获取Redis锁和执行MySQL事务时,设置合理的超时时间。当一个事务获取锁或执行事务的时间超过设定的超时时间,就主动放弃操作并释放已获取的资源,避免长时间等待造成死锁。
- 优点:
- 简单易实现:只需在代码中增加设置超时时间的逻辑,不需要复杂的算法或额外的监控机制。
- 能有效避免长时间死锁:通过限制等待时间,确保事务不会无限期等待资源,快速释放已占有的资源,减少死锁发生的可能性。
- 缺点:
- 误判问题:如果设置的超时时间过短,可能会导致一些正常的事务因短暂的资源繁忙而被误判为超时,从而放弃操作,影响系统的正常运行。
- 无法解决瞬时死锁:对于极短时间内发生的死锁,超时机制可能来不及发挥作用,死锁依然会出现。