在 MySQL 中,死锁(Deadlock)是指在多个事务在执行过程中 互相等待对方持有的资源,从而导致所有事务都无法继续执行的一种并发控制问题。死锁是数据库在进行并发操作时常见的现象,尤其在使用事务和锁机制时容易出现。
LLM大模型
error-2024122220.log: 2024-12-2220:56:30.859 flow/user_coin_dao.go:141ERR0R flow|UserCoinDao|addCoin|db update error.uid:110,coin_kind:start_moonnum:14100,err:Error 1213:Deadlock to get lock;try restarting transaction {"trace_id":"4e0598be598e37eb315d6cc2"}error-2024122220.1og:2024-12-22 20:56:30.866 transfer_dao.go:136 ERROR 设置加币失败状态 to ORDER_STATUS_FAIL Failed:Error 1213:Deadlock found when trying to gensToPinfo'"ID":5891"OrderID":"AA220590753907966737195634867197 TransactionTime":"2024-12-22T20:56:31+08:00 BackTime 2024-12-22T20:56:31+08:00 ceDesc“流转-星币-\u003e星钻-送礼"CreatedAt":"2024-12-22T20:56:31+08:00","UpdatedAt":"2021-12-22T20:56:31+08:00"","raw_query"headers"to"":[{"uid":1003249,"coin_kind":"start_moon","num":150,"origin_from_kind_num":150,"ex":""},{"uid":1005051,"coin_kind":"start_moon","num":750,"origin_from_kind_num":750,"ex"""},...
开启事务加行锁,改余额插流水提交事务,释放锁
-
事务设计原则 保持事务短小,尽量减少事务的执行时间,避免长时间占用锁资源。 使用一致性事务逻辑,多表操作,确保事务处理顺序一致,避免不同事务有不同顺序加锁行为。
-
加锁顺序建议 为了消除死锁风险,应该: 统一加锁:在不同事务中按照相同的顺序获取锁,避免形成循环等待。 避免嵌套事务:可能会增加锁冲突的概率,难以控制并发。
-
锁类型与锁行为 尽量使用行级锁,而不是全表锁。不要为同一行授予多个锁,会增加死锁发生的可能性。不要使用 SELECT FOR UPDATE 时完全不加条件,指定明确WHERE条件。
-
事务并发控制策略 控制事务的并发量:同一时间不要让太多事务同时执行,可以在业务层使用限流、队列控制等方式来减少并发请求冲击。 设置合理的锁等待超时时间:可以通过 innodb_lock_wait_timeout 控制事务等待的超时时间(单位为秒)。
-
数据库配置建议
SHOW ENGINE INNODB STATUS;
SET GLOBAL innodb_status_output = ON;SET GLOBAL innodb_status_output_locks = ON;
SHOW ENGINE INNODB DEADLOCKS;

