触发器中避免跨表写操作、禁止SELECT...FOR UPDATE、不依赖MAX(id)等自增推导,推荐应用层异步处理或预分配ID,并通过死锁日志和performance_schema定位问题。触发器里别碰其他表的写操作死锁在触发器里爆发,八成是因为它偷偷去改了别的表。比如 INSERT 一个订单后,触发器顺手去 UPDATE 库存表,而另一条事务正相反------先锁库存再插订单,两边一卡,就 deadlock 了。实操建议:触发器逻辑尽量只操作当前表(NEW 和 OLD 所属的表),避免 UPDATE/DELETE 其他表真要联动更新,改用应用层异步处理(比如发 MQ 消息),或退一步用延迟写入(如插入到日志表,由定时任务批量处理)查 SHOW ENGINE INNODB STATUS 时重点看 *** (1) WAITING FOR THIS LOCK TO BE GRANTED: 后面是不是跨表锁避免在触发器中调用存储函数或复杂子查询看起来只是读个配置值,但万一那个 SELECT 带了 FOR UPDATE 或命中了没索引的字段,就会拉长锁持有时间,提高死锁概率。实操建议:触发器内禁止出现 SELECT ... FOR UPDATE、SELECT ... LOCK IN SHARE MODE所有读操作必须走覆盖索引;如果要查配置,优先用常量或应用层缓存,而不是实时查 config_table用 EXPLAIN 确认触发器里每个 SELECT 的 type 是 const 或 ref,不是 ALL 或 indexINSERT 触发器慎用 BEFORE INSERT + 自增主键依赖当多个并发 INSERT 都在 BEFORE INSERT 里试图读取 MAX(id) 或调用 LAST_INSERT_ID(),很容易因为间隙锁(gap lock)互相阻塞,尤其在可重复读隔离级别下。 唱鸭 音乐创作全流程的AI自动作曲工具,集 AI 辅助作词、AI 自动作曲、编曲、混音于一体
相关推荐
程序员雷欧4 分钟前
LongAdderShuiShenHuoLe8 分钟前
HmarkX(码笺)的本地数据库模块重构实战Databend11 分钟前
从 Kafka 到 Databend Cloud:万亿级 Agent Trace 接入链路的工程实践月光船幽幽15 分钟前
分层阈值规避归藏协议过度重置倔强的石头_18 分钟前
SQL Server数据迁移,不只是把数据搬过去SMF191920 分钟前
【Linux】完美解决缩略图工具gm调用java.io.FileNotFoundException: gm问题㳺三才人子23 分钟前
初探 Data Analysis - Matplotlibacd1200926 分钟前
Redis 缓存和数据库一致性,到底怎么搞?sugar__salt28 分钟前
MyBatis-Plus 从入门到实战:高效简化数据库开发的完整指南CodeBlog-star32 分钟前
AI Agent 高并发实战:Redis 限流、队列、缓存与高可用全栈方案