本文针对MySQL InnoDB中在Repeatable Read的隔离级别下使用select for update可能引发的死锁问题进行分析. 1. 业务案例 业务中需要对各种类型的实体进行编号,例如对于x类实体的编号可能是x201712120001,x201712120002,x201712120003类似于这样.可以观察到这类编号有两个部分组成:x+日期作为前缀,以及流水号(这里是四位的流水号). 如果用数据库表实现一个能够分配流水号的需求,无外乎就可以建立一个类似于下面的表: CREAT
INSERT ON DUPLICATE UPDATE与死锁 在MySQL中提供两种插入更新的方式:REPLACE INTO和INSERT ON DUPLICATE UPDATE,简化了“存在则更新,不存在则插入”的实现逻辑,但这两种方式在MySQL内部都被拆分为多个操作步骤且引入GAP锁来保证数据完整性,因此在高并发情况下极易产生死锁.##==================================================##在MySQL中INSERT ON DUPLICATE
前几天线上收到一条告警邮件,生产环境MySQL操作发生了死锁,邮件告警的提炼出来的SQL大致如下. update pe_order_product_info_test set end_time = '2021-04-30 23:59:59' where order_no = '111111111' and product_id = 123456 and status in (1,2); update pe_order_product_info_test set end_time = '2021-