- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个带有 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/
我正在编写一个 Web 应用程序,两个不同的用户可以在其中更新事物列表,例如待办事项列表。我已经意识到,乐观锁定机制效果最好,因为我不希望出现高争用情况。 我一直在查看事务隔离级别,现在我有点困惑。看
这个问题在这里已经有了答案: Pessimistic versus Optimistic Concurrency (Locking versus Feedback) (3 个答案) 关闭 8 年前。
我是一名优秀的程序员,十分优秀!