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

场景描述:

mysql 中order 表有一个触发器,新增的order 将自动创建一个订单编号;编号为日期+今日订单数量

此触发器在单线程(命令行执行批量插入)下跑很正常,ext_order_id 不会重复;

但我这边的场景并发多线程写入order表,此时ext_order_id 会出现重复;

怎么解决呢?锁表,这个风险太大,不敢使用;看了看存储过程的优点,应该可以解决这个问题,写了存储过程:

修改php代码,使用 generate_orderNo2 来处理;

尝试多线程执行写入,依然重复了,看来存储过程真的就是一些过程的封装,不能保证过程的独占性;

解决方案,我的订单数据来源是一个订单数据原始表(order_source),茅塞顿开,之前的触发器获取的是order表的今日数量,order表同时写入编号就会重复,而 order_source 表是已经存在的数据,不会发生变化,直接获取订单在 order_source 表中的位置排序即可,改变了触发器为:

尝试多线程执行写入,没有重复,完美;

 

此种php多线程使用的是 GuzzleHttp 的多线程方案,同时发起30条任务:

 

 

打赏
暂无评论

请到【后台 - 用户 - 我的个人资料】中填写个人说明。

发表评论