1213(ER_LOCK_DEADLOCK)。1205(ER_LOCK_WAIT_TIMEOUT)。序号 | 可能原因 |
1 | 多个事务以不同顺序访问相同的表或行,形成锁等待环。 |
2 | 事务中执行时间过长,持有锁的时间过长,增加死锁概率。 |
3 | 并发量突增,锁竞争加剧,短时间内大量事务争抢同一批资源。 |
4 | 死锁检测未开启或锁等待超时设置不合理,导致死锁无法被及时检测和解除。 |
可能原因 | 解决思路 |
事务访问顺序不一致 | 统一事务中表的访问顺序,确保并发事务按相同顺序加锁。 |
事务执行时间过长 | 拆分大事务为小事务,减少单事务持锁时间;优化事务内 SQL 执行效率。 |
并发量突增 | 业务侧进行限流或错峰执行,降低并发争抢强度。 |
死锁检测未开启 | 通过控制台开启死锁检测,并合理设置锁等待超时时间。 |
监控指标 | 说明 | 关注点 |
SQL 失败数 | 每秒失败的 SQL 数量 | 死锁发生时,失败数会突增 |
活跃线程数 | 当前活跃线程数 | 并发量是否突增 |
慢查询数 | 每秒慢查询数量 | 锁等待是否导致查询变慢 |
CPU 利用率 | 实例 CPU 使用率 | 锁竞争是否导致 CPU 升高 |
SELECTrollback_trans_id,cycle_transactions,occurred_atFROM information_schema.TDSTORE_PESSIMISTIC_DEADLOCK_INFOORDER BY occurred_at DESCLIMIT 20;
rollback_trans_id:被回滚的事务 ID。cycle_transactions:构成死锁环的事务列表。occurred_at:死锁发生时间。SELECTrollback_trans_id,requesting_node,requesting_trans_id,blocking_trans_id,req_lock_range,blk_lock_range,occurred_at,requesting_sqlFROM information_schema.TDSTORE_PESSIMISTIC_DEADLOCK_DETAIL_INFOORDER BY occurred_at DESCLIMIT 20
TIME 值较大的会话,这些会话可能正在等待锁资源。SELECTID,USER,HOST,DB,COMMAND,TIME,STATE,INFOFROM information_schema.PROCESSLISTWHERE COMMAND != 'Sleep'ORDER BY TIME DESCLIMIT 20
KILL 命令终止该会话以释放锁资源。KILL <会话ID>;
KILL 操作会中断正在执行的事务并触发回滚,请确认目标会话后再执行,避免误杀正常业务会话。参数名 | 说明 | 默认值 |
tdstore_deadlock_detect | 是否开启死锁检测。开启后系统会自动检测死锁环并回滚其中一个事务。 | OFF |
tdstore_deadlock_victim | 死锁发生时选择牺牲事务的策略。 WRITE_LEAST 优先回滚写数据量较少的事务;START_LATEST 优先回滚较晚开启的事务。 | WRITE_LEAST |
tdstore_deadlock_detect 的值修改为 ON,开启死锁检测。tdstore_deadlock_victim 的值:WRITE_LEAST:优先保护写数据量大的事务,适合以数据写入为主的场景。START_LATEST:优先保护先开启的事务,适合事务执行顺序明确的场景。tdsql_lock_wait_timeout 参数。tdsql_lock_wait_timeout 参数。SELECT ... FOR UPDATE 时,尽量只锁定需要的行,避免锁定过多资源。EXPLAIN 查看执行计划。EXPLAIN UPDATE table_name SET ... WHERE ...;
type 列为 ALL 表示全表扫描,会锁定大量行,需要添加索引。rows 列值过大说明扫描行数过多,锁定的行也越多。WHERE 条件列添加索引,减少扫描和锁定行数。UPDATE 或 DELETE。LIMIT 限制单次操作影响的行数。tdstore_deadlock_detect 参数设置为 ON,使系统自动检测并解除死锁。文档反馈