什么样的锁定/事务隔离级别适合这种情况?

时间:2011-06-20 14:38:18

标签: mysql concurrency transactions locking

假设我有学生和学校表。我正在执行的一项操作是:

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

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

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

基本上,在事务修改表时,应该无法运行读取。另外,写入也不应该同时发生。

2 个答案:

答案 0 :(得分:3)

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

如果您使用select for update,

答案 1 :(得分:0)

您可以使用锁定表来防止这种情况发生。有关锁定表的更多信息,请查看this

修改

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