概述
考虑以下细节:
user
的表格。它是一个名为wallet
。walletAction
的表格。我们在用户正在执行的每个钱包操作上插入一个新条目。此表的作用类似于数据库中的某种日志,并进行了一些计算。N
分钟执行一次更新。每个CRON操作都通过使用独立的API获取一些数据,然后插入'一个新的walletAction
条目。在sime时间,它会更新user
。wallet
的值。user
可以从我们的网站购买东西。当user
点击“购买”按钮时,我们会插入新的walletAction
条目并更改user
。wallet
列。问题
我担心 CRON更新和user
点击购买按钮时的操作会在同一时间发生,导致条目在walletAction
表中进行错误的计算。
我需要某种锁定'关于CRON更新执行或类似的事情。
问题
user
单击购买按钮时的操作中?)答案 0 :(得分:0)
php
或GO
似乎并未在Java
上实现并发。你可以实现一些技巧,但几乎他们为你带来了新的问题:)。为了解决您的问题,我建议您使用optimistic lock
。有关详细信息,请参阅http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#optimistic-locks。
答案 1 :(得分:0)
是的,在这种情况下,我建议使用隔离级别最高yii\db\Transaction::SERIALIZABLE
的{{3}}。
这个级别应该防止“幻读”和“不可重复读”。
此外,我建议在执行1个以上相关更改时始终使用事务,因为这有助于保持数据库的一致性。
这可以防止在成功将新行插入walletAction
之后但在user.wallet
更新之前获得某些PHP异常时出现问题。