2026-05-18 20:47:04
我经历过数据库死锁事故,以下结合具体案例说明死锁的发生过程、原因及避免方法:
死锁案例背景业务涉及新增订单、修改订单、查询订单等操作,为保证订单唯一性,在新增订单时通过 select ... for update 语句进行幂等性校验,即先查询订单是否存在,不存在才插入记录。当业务量较大时,出现死锁问题。
死锁发生过程

记录锁(Record Lock):锁的是记录本身。
间隙锁(Gap Lock):锁的是两个值之间的空隙,防止其他事务在这个空隙间插入新数据,避免幻读现象。

设置事务等待锁的超时时间:在 InnoDB 中,参数 innodb_lock_wait_timeout 用于设置超时时间,默认 50 秒。当一个事务的等待时间超过该值后,事务进行回滚,锁释放,另一个事务可继续执行。当发生超时后,会出现提示信息。
开启主动死锁检测:将参数 innodb_deadlock_detect 设置为 on(默认开启),主动死锁检测在发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。当检测到死锁后,会出现提示信息。