如何使用Yii2和MySQL事务处理并发问题?

时间:2016-01-17 11:36:12

标签: php mysql transactions yii2

概述

考虑以下细节:

  1. 我们有一个名为user的表格。它是一个名为wallet
  2. 的列
  3. 我们有一个名为walletAction的表格。我们在用户正在执行的每个钱包操作上插入一个新条目。此表的作用类似于数据库中的某种日志,并进行了一些计算。
  4. 我们有一个CRON命令,每隔N分钟执行一次更新。每个CRON操作都通过使用独立的API获取一些数据,然后插入'一个新的walletAction条目。在sime时间,它会更新userwallet的值。
  5. user可以从我们的网站购买东西。当user点击“购买”按钮时,我们会插入新的walletAction条目并更改userwallet列。
  6. 问题

    我担心 CRON更新user点击购买按钮时的操作会在同一时间发生,导致条目在walletAction表中进行错误的计算。

    我需要某种锁定'关于CRON更新执行或类似的事情。

    问题

    1. 我应该害怕这种情况吗?
    2. 如何避免此问题?
    3. 使用MySQL事务可以避免这种麻烦吗?
    4. 我应该使用什么隔离级别,在哪种情况下我应该使用它? (在CRON命令中或user单击购买按钮时的操作中?)

2 个答案:

答案 0 :(得分:0)

phpGO似乎并未在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异常时出现问题。