欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

秒杀场景下 如何保证数据准确

程序员文章站 2024-01-10 09:20:40
...
秒杀时 商品价格递增,比如第一个买的两百,第二个买的三百,第三个四百以此类推,同时修改库存等其他表

在更新的时候防止超卖等问题我用的是行锁,插入的时候为了确保数据准确使用了唯一索引 但是带来的问题是秒杀成功率低

请问在插入或者更新的时候如何保证数据的准确性与完整性和相对较高的处理效率,因为之前没做过类似应用 希望大家能给出思路

回复内容:

秒杀时 商品价格递增,比如第一个买的两百,第二个买的三百,第三个四百以此类推,同时修改库存等其他表

在更新的时候防止超卖等问题我用的是行锁,插入的时候为了确保数据准确使用了唯一索引 但是带来的问题是秒杀成功率低

请问在插入或者更新的时候如何保证数据的准确性与完整性和相对较高的处理效率,因为之前没做过类似应用 希望大家能给出思路

秒杀自古只有一个问题:

机器与程序性能是否能支撑住秒杀业务。

能撑住就随便玩,撑不住,那就使用各种【优化】:

1.秒杀前,对参与秒杀的用户进行登记,不登记的无法秒杀。
登记的作用是,筛选出参与秒杀的用户,一般这个量比较少,把他们的数据放入专用表里,可以提高检索速度。

2.使用C或C++写的高速队列来为后端数据库减压,同时也容易保证数据的正确性。

3.使用分时算法,也就是5秒内,数据库以日志的形式,写入所有人的秒杀数据,此时数据库不能进行其他任何操作,比如查结果。5秒后,关闭写入,此时对日志进行去重、合法性判断等操作,这个过程中数据库同样不能进行其他任何操作,比如写入秒杀日志。这些操作进行完毕后,向客户端返回秒杀结果。接着,再进行5秒钟的秒杀日志写入操作。这种方法,在参与人数远远大于商品数量的时候,特别有效。

可以适当修改秒杀流程,分成两部分:
1、只插入秒杀数据,并在一定时间后停止秒杀(也可能有比实际库存多的记录进来)。该流程只告诉用户提交成功,但是不告诉其准确结果;
2、有一个后台进程,根据秒杀记录及库存来评判其是否成功,以及对应的价格,并更新库存。该流程结束后,用户在秒杀记录里边可以查看最后的结果。

这样做的好处是,不会引发并发问题,能保证数据准确性,用户也能在较短时间内获知到秒杀结果。

相关标签: php 秒杀 并发