MySQL Race Conditions

后端 未结 4 898
半阙折子戏
半阙折子戏 2021-01-07 06:15

Does this cause a race condition with MySQL (InnoDB):

  1. Start Transaction.

  2. Try to get record.

  3. If record doesn\'t exist, return

相关标签:
4条回答
  • 2021-01-07 06:38

    Yes, it's possible for another transaction to check the table after you've read it.

    Worse yet, because of how transactions work, even after you delete the row, any new transactions that start will see the row because you haven't yet committed the delete.

    SELECT ... FOR UPDATE is one way to prevent it.

    LOCK TABLE tablename is another.

    Unfortunately, since you're using an ORM, I couldn't say whether it has the ability to do either of these.

    0 讨论(0)
  • 2021-01-07 06:47

    Journeyman Programmer, I believe, has the correct solution. Since you've indicated you are using a broken ORM tool (one that will not allow you to query for update) I'd suggest that you move your INSERT into the log table into a trigger on the delete operation so you will avoid the duplicate entry.

    0 讨论(0)
  • 2021-01-07 06:50

    Start Transaction.

    Delete record /* using the very same criteria you use for 'try to get record' */

    if response indicates record was indeed deleted, add a log entry.

    End Transaction (commit/rollback).

    No more race condition.

    0 讨论(0)
  • 2021-01-07 06:55

    Use 'select for update' at step 2. Only one process will be able to get a lock on the row thus avoiding the scenario you described.

    0 讨论(0)
提交回复
热议问题