gpt4 book ai didi

php - 谈论并发 PHP 时的最佳方法

转载 作者:行者123 更新时间:2023-12-04 03:58:38 28 4
gpt4 key购买 nike

我正在开发 php + mysql 项目,我们在该项目中使用了一个余额列来跟踪用户的余额。每当用户进行购买时,他们的余额就会被扣除。但是,我试图找出在尝试购买产品时处理来自同一用户的多个请求的最佳方法。我做了一些研究并编写了以下 2 种方法,我看不出这里有什么区别,谁能解释一下这两种方法之间的区别是什么,哪种方法在并发性方面最好?

Approach 1:
START transaction
"SELECT balance from users where user_id = 1 FOR UPDATE"

check if balance - product price is enough then UPDATE
commit

Approach 2:
"UPDATE users set balance = balance - 30 where user_id = 1 AND balance - 30 >= 0"

如您所见,选项 2 的代码更少,但我仍然看到很多人推荐第一种方法(先锁定行然后更新)。

任何人都可以帮助我了解这里的实际区别是什么,以及当您关心并发性并希望避免可能使余额列无效的多个请求时最好使用哪个?如果您有更好的方法,请告诉我,也许我想多了。我正在使用 PDO。

最佳答案

这两种解决方案最终都可以防止竞争条件。 SQL 数据库具有原子性、一致性、隔离性和持久性 (ACID) 属性。 SQL 数据库的妙处:如果事务处理正确,您就不必担心竞争条件。

第二个示例中的 UPDATE 之类的单语句操作始终是原子事务。而且,您(正确编写的)第一个示例中的显式事务也是一个原子事务。

与@GMB 一样,我更喜欢尽可能使用单语句操作。但这只是因为代码更容易让下一个程序员(或我 future 的自己)理解。两种方法都有效。

而且,如果您的业务规则变得更加复杂,您可能需要多语句事务。这是第一种方法的优势。

你们的两种解决方案都是保酸的。

关于php - 谈论并发 PHP 时的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63459961/

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