gpt4 book ai didi

php - 安全地减少用户余额列。我应该使用乐观锁定吗?

转载 作者:可可西里 更新时间:2023-11-01 06:30:01 26 4
gpt4 key购买 nike

我有一个带有 MySQL/Doctrine ORM 的简单 Silex 网络应用程序。每个用户都有 balance(这是一个简单的应用程序,所以只有列就可以了),我需要在执行某些操作后减少它(当然要检查它是否 > 0)。

据我所知,我可以使用乐观锁定来避免冲突/漏洞。我已阅读文档 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/transactions-and-concurrency.html但我找不到任何关于使用它的完整示例。

我从哪里获得“预期版本”?我需要将其作为输入(隐藏表单字段)传递吗?或者有更好的方法吗?文档说了一些关于 session 的内容,但我不知道如何将它存储在那里(根据每个请求更新 session ?)。

此外,如果我将它作为输入传递,那么据我所知,在捕获 OptimisticLockException 之后没有办法在不通知用户的情况下自动重复查询吗? (例如,如果用户打开两个选项卡并在其中一一提交请求)

我的目标只是防止当用户同时发送多个请求并且余额只减少一次等时出现潜在问题。因此最好能够在锁定错误时自动重复它而不涉及用户。因为如果我通过表单传递它,那么很可能会因为多个选项卡而出现此错误。所以它看起来有点复杂,也许还有其他东西而不是乐观锁定?

最佳答案

您应该只对不能自动执行的操作使用锁定。因此,如果可能,请避免查询对象、检查数量然后更新它。相反,如果您这样做:

update user set balance = (balance + :amount) 
where (balance + :amount) >= 0
and id = :user_id

您将在一次操作中检查和更新,如果检查通过且余额已更新,则更新的行数将为 1,否则为 0。

关于php - 安全地减少用户余额列。我应该使用乐观锁定吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48505065/

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