文档中心 > 聚石塔

ERP系统中的商品匹配方案

更新时间:2016/03/30 访问次数:31275

背景介绍


        在ERP系统的转单或客审业务场景中,有一个商品匹配环节,即淘宝推送订单的商品与ISV业务库的商品相匹配的过程。这个过程涉及DB的操作较多,很容易导致转单或客审效率较慢,引发RDS的性能消耗较大,尤其是引发mysql的行锁等待。

                                     

业务及引发的问题

所谓商品匹配是指淘宝订单里的num_iid、sku_id等标示商品的字段信息和ISV商品库的商品进行匹配,这个匹配一般是通过DB来查询完成。当然对于ISV商品数较少的情况完全可以放在内存中进行。
所谓库存更新是指库存的扣减,即减1操作。数据库的访问其实就是磁盘文件的访问,当有多个请求同时扣减同一行商品数据记录时,mysql会把并发串行化,也就是给同时访问同一行记录的排个序,一个一个执行,并生成排它锁,在当前这个update语句commit之前,其它请求等待执行,commit后生成新版本,再接着执行下一个请求。这里就会出现一个问题:商品数越少,订单越多(大促情况下),越容易出现行锁的等待。

两个方案


方案1:针对大促情况下,商品数较少的ERP软件可以通过操作缓存+定时持久化的方式做库存更新,减少DB访问和行锁等待现象,提高效率。

                               

方案2:对于商品数较大的ERP也考虑采用批量匹配+合并更新的方式来减少DB访问次数和行锁等待情况

                                

In批量查询:
取一批淘宝推送订单,采用mysql的in查询ISV业务库的商品,
Select * from talbe where sku in (sku1,sku2,…skun)
若业务商品库的数据量较大时,in的数目不得多于200,in数目如果太多mysql会直接选择全表扫描。

合并批量更新:
将相同的sku合并,并采用批量更新方式扣减库存。
boolean autoCommit=conn.getAutoCommit();
//关闭自动提交
conn.setAutoCommit(false);
//使用Statement同时收集多条sql语句
stmt.addBatch(update_sql1);
stmt.addBatchupdate_sql2);
stmt.addBatch(update_sql3);
..
//同时提交所有的sql语句
stmt.executeBatch();

方案优缺点

两者的共同点都是为了减少DB访问次数,优化DB行锁。方案1主要适用少量商品数的场景,编码简单,但可能系统部署起来稍微麻烦一些,方案2比较通用,部署也简单些,但需要一定的编码要求。应根据自己具体的架构选择相应的方案。

FAQ

关于此文档暂时还没有FAQ
返回
顶部