gpt4 book ai didi

java - 电子商务应用程序设计(例如 : Amazon/ebay/flipkart ): Concurrency issues handling

转载 作者:搜寻专家 更新时间:2023-10-30 19:47:17 25 4
gpt4 key购买 nike

我一直在试图了解亚马逊将如何处理并发写入问题,例如当多个用户试图购买可用数量只有一个的相同产品时。

考虑到“PRODUCT”表有以下字段:

enter image description here

我正在寻找有关数据库事务和锁定方面的详细解释,或者是用更详细的技术术语来处理这种情况的任何其他方法。

假设当 2 个用户在他们的购物车中添加了相同的产品并且一个用户继续付款时:

一个)

开始交易

SELECT * FROM PRODUCT WHERE ID = 1 AND STATUS = "AVAILABLE"FOR UPDATE;

将产品表中的数量字段更新为“0”和 STATUS =“SOLD OUT”

调用支付网关

如果付款超时回滚

提交

结束交易

============================================= ============================虽然上述交易仍在进行中,但其他用户仍然可以看到可用的产品,因为它仍未提交,他们也可以继续付款。

此外,如果有足够数量的产品可用,锁定产品行可能会阻止其他用户同时尝试购买相同的产品。

============================================= ============================

如何处理这个问题?

我已经阅读了以下关于在数据库上使用乐观锁定的博客,但发现很难深入理解具体如何实现。

Design eCommerce Website - Concurrency

最佳答案

让两个事务同时运行上面的代码,分别命名为tx1和tx2。tx1 和 tx2 都会首先尝试运行

SELECT * FROM PRODUCT WHERE ID = 1 AND STATUS = "AVAILABLE" FOR UPDATE; 

这个查询也意味着从结果集中获取行上的锁。自然地,只有一个事务可以获取它,因此另一个事务将不得不等待。例如,如果 tx1 获得了锁,tx2 将等待直到 tx1 提交并释放锁。然后,tx2 也将继续并提交,因为它只是将数量设置为 0。因此,上述方法不会按预期工作,因为最终,两个用户都会收到有关他们购买的成功消息。但是,如果您想保留这种方法,不是直接将数量设置为零,而是将其减少 1,并对列进行约束,声明其值不能低于 0。以这种方式,tx2 将失败由于违反约束(记住 ACID 的 C - 一致性)并回滚,因此第二个用户将收到一条消息,表明他/她的购买失败。

或者,如果您不想为这个特定示例实现额外的约束而只是直接设置数量,您可以使用乐观锁定,它使用透明的行版本控制并且在性能方面也更便宜。所以对于id为1的产品(姑且称之为P),tx1生成一个新版本的P(P1),tx2同时生成另一个新版本的P(P2)。当 tx1 和 tx2 中的任何一个尝试提交时,系统会注意到 P 有新的未提交版本,即 P1 和 P2,并且只需要批准其中一个。结果,P1可能被选为接受的P的新版本,从而tx1成功,购买成功,P2被拒绝,tx2被中止并回滚,第二个用户收到关于他/她的购买失败的消息。另请注意,相反的情况也可能发生,即 P2 被接受而 P1 被拒绝。

最后,关于乐观锁和悲观锁考虑以下几点:

  1. 如果应用程序开发人员估计冲突不会经常发生,则首选乐观锁定
  2. 如果您不希望由于频繁的并发更新而导致频繁失败,则可以采用悲观锁定。

就我个人而言,我会选择悲观锁定但修复上述事务,因为对于大于 1 的数量,乐观锁定仍会导致一个事务中止,而使用悲观锁定可以成功地为两个事务提供服务,但会稍微牺牲性能。

While still above transaction is going on, other users can still see the PRODUCT available as it is still not committed and they may also proceed to PAY.

关于这个,可能与用户屏幕的刷新率有关。即使用户能够继续付款(前端的陈旧数据),后端也应验证用户是否有资格进行购买,如果是,则继续购买(所有这些都在一次交易中完成) )

Also, if the sufficient quantity of product is available, taking a lock on the product row may stop other users trying to buy the same product at same time.

这就是悲观锁的重点,性能下降是其主要影响,但只要数量不为0,所有事务都可以服务。乐观锁只有1成功,其他失败,提示用户再次尝试购买。

关于java - 电子商务应用程序设计(例如 : Amazon/ebay/flipkart ): Concurrency issues handling,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53976375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com