X

Tag: 多线程

并发多线程引起的 mysql 触发器 编号重复

场景描述: mysql 中order 表有一个触发器,新增的order 将自动创建一个订单编号;编号为日期+今日订单数量 [crayon-6636cf8875e19286076080/] 此触发器在单线程(命令行执行批量插入)下跑很正常,ext_order_id 不会重复; 但我这边的场景并发多线程写入order表,此时ext_order_id 会出现重复; 怎么解决呢?锁表,这个风险太大,不敢使用;看了看存储过程的优点,应该可以解决这个问题,写了存储过程: [crayon-6636cf8875e20348948509/] 修改php代码,使用 generate_orderNo2 来处理; [crayon-6636cf8875e22917374960/] 尝试多线程执行写入,依然重复了,看来存储过程真的就是一些过程的封装,不能保证过程的独占性; 解决方案,我的订单数据来源是一个订单数据原始表(order_source),茅塞顿开,之前的触发器获取的是order表的今日数量,order表同时写入编号就会重复,而 order_source 表是已经存在的数据,不会发生变化,直接获取订单在 order_source 表中的位置排序即可,改变了触发器为:…