2011-06-20 27 views
2

假设我有一张学生和一张学校的桌子。我正在执行一个操作是这样的:什么样的锁定/事务隔离级别适合这种情况?

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

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

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

所以基本上,一个读操作不应该能够在事务修改表时运行。另外,写入也不应该同时发生。

回答

3

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

如果使用select进行更新,

+0

优秀,正是我需要的。谢谢! –

0

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

编辑

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

+0

问题是,我必须在事务中间锁定表。根据手册,启动或提交事务显式释放任何表锁。 –

+0

如果你想明确地看到这没有发生,那么有一个存储标志或某物的表格,关于当前正在发生什么动作,如果没有发生任何动作,则返回null。因此在执行任何操作之前,请检查表格然后继续。 – Balanivash