好吧,我得到了一个任务[迷你项目],其中一个最重要的问题是数据库的一致性。 该项目是一个Web应用程序,允许多个用户访问和使用它。我可以期待并发查询和更新请求到一小组表中,其中一些表彼此连接(使用FOREIGN KEYS)。
为了使数据库尽可能保持一致,我们建议使用隔离级别。在读了一下(可能还不够?)后,我认为对我来说最有用的是READ COMMITTED和SERIALIZABLE。
我可以将查询分为三种:
对于第一个,我需要数据一致,我不想呈现脏数据或未提交的数据等。因此,我认为对这些查询使用READ COMMITTED。 对于更新查询,我认为使用SERIALIZABLE将是最好的选择,但阅读后,我发现自己迷路了。 在组合中,我可能必须从数据库中读取,并决定是否需要/可以更新,这2-3个调用将在同一个事务中。
想要询问一些建议,在每个查询选项中使用隔离级别。我是否应该考虑每种类型的不同隔离级别?或只是坚持一个?
我正在使用MySQL 5.1.53,以及MySQL JDBC 3.1.14驱动程序(要求......没有选择JDBC版本)
非常感谢您的见解!
编辑:
我已经决定使用 REPEATABLE READ 这似乎是默认级别。 我不确定这是否是正确的方法,但我猜可重复阅读以及锁定共享模式和 FOR UPDATE 查询应该可以正常工作......
你们有什么想法?
答案 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