【问题标题】:What kind of locking/transaction isolation level is appropriate for this situation?什么样的锁定/事务隔离级别适合这种情况?
【发布时间】:2011-06-20 14:38:18
【问题描述】:

假设我有一个 Student 和一个 School 表。我正在执行的一项操作是:

  • 删除属于学校的所有学生
  • 修改学校本身(可能更改名称或其他字段)
  • 加回一群学生

担心这种情况:两个人同时编辑学校/学生。一个提交他们的更改。不久之后,其他人提交了他们的更改。这不会成为问题,因为在第二个用户的情况下,应用程序会注意到他们正在尝试覆盖新修订版。

担心这一点:有人打开了学校/学生的编辑器(这涉及从表格中读取),同时正在运行修改它们的事务。

所以基本上,当事务正在修改表时,读取不应该能够运行。此外,写入也不应该同时发生。

【问题讨论】:

    标签: mysql concurrency transactions locking


    【解决方案1】:

    只有在可序列化的隔离级别下,MySQL 才允许您读取正在被另一个事务修改的行。在任何较低的隔离级别中,您将看到处于修改它们的事务之前的状态的行已启动。当然,在 READ_UNCOMITTED 中,行将被视为已删除/修改,尽管事务尚未完成。

    如果你使用 select 进行更新,

    【讨论】:

    • 非常好,正是我需要的。谢谢!
    【解决方案2】:

    您可以使用表锁定来防止这种情况。查看this 了解更多关于锁表的信息

    编辑

    看看这个how to lock some row as they don't be selected in other transaction。认为类似的方法也可以应用于表格

    【讨论】:

    • 问题是,我必须在事务中间锁定表。根据手册,启动或提交事务显式释放任何表锁。
    • 如果你想明确地看到这不会发生,那么有一个表来存储一个标志或其他东西,关于当前正在发生什么动作,如果什么都没有发生,则为 null。因此,在执行任何操作之前,请检查表格然后继续。
    猜你喜欢
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 2015-10-18
    • 2011-03-25
    • 2011-08-18
    相关资源
    最近更新 更多