在基本的MySQL项目中使用哪个隔离级别?

时间:2011-09-17 15:22:34

标签: mysql transactions isolation-level transaction-isolation

好吧,我得到了一个任务[迷你项目],其中一个最重要的问题是数据库的一致性。 该项目是一个Web应用程序,允许多个用户访问和使用它。我可以期待并发查询和更新请求到一小组表中,其中一些表彼此连接(使用FOREIGN KEYS)。

为了使数据库尽可能保持一致,我们建议使用隔离级别。在读了一下(可能还不够?)后,我认为对我来说最有用的是READ COMMITTED和SERIALIZABLE。

我可以将查询分为三种:

  1. 获取查询
  2. 更新查询
  3. 组合
  4. 对于第一个,我需要数据一致,我不想呈现脏数据或未提交的数据等。因此,我认为对这些查询使用READ COMMITTED。 对于更新查询,我认为使用SERIALIZABLE将是最好的选择,但阅读后,我发现自己迷路了。 在组合中,我可能必须从数据库中读取,并决定是否需要/可以更新,这2-3个调用将在同一个事务中。

    想要询问一些建议,在每个查询选项中使用隔离级别。我是否应该考虑每种类型的不同隔离级别?或只是坚持一个?

    我正在使用MySQL 5.1.53,以及MySQL JDBC 3.1.14驱动程序(要求......没有选择JDBC版本)

    非常感谢您的见解!

    编辑:

    我已经决定使用 REPEATABLE READ 这似乎是默认级别。 我不确定这是否是正确的方法,但我猜可重复阅读以及锁定共享模式 FOR UPDATE 查询应该可以正常工作......

    你们有什么想法?

2 个答案:

答案 0 :(得分:0)

我建议阅读已提交。能够很快看到其他会话已提交的数据似乎很自然。

目前尚不清楚为什么MySQL具有默认值REPEATABLE READ。

答案 1 :(得分:-2)

我认为你过分担心隔离级别。

如果要更新多个表,则需要执行以下操作:

START TRANSACTION;
  UPDATE table1 ....;
  UPDATE table2 ....;
  UPDATE table3 ....;
COMMIT;  

这是重要的东西,隔离级别只是肉汁。

可重复读取的默认级别对您来说很合适。

请注意,select ... for update会锁定表,这可能会导致死锁,这比您可能尝试解决的问题更糟糕。
如果要删除数据库中的行,仅使用此

老实说,我很少看到数据库中的行被删除,如果您只是在进行更新,那么只需使用普通选择。

无论如何看:http://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-model.html