4

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

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

我可以将查询分为三种:

  1. 获取查询
  2. 更新查询
  3. 组合

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

想征求一些建议,在这些查询选项中使用哪种隔离级别。我是否应该为每种类型考虑不同的隔离级别?还是坚持一个?

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

非常感谢您的见解!

编辑:

我决定我将使用REPEATABLE READ,这似乎是默认级别。我不确定这是否是正确的方法,但我想REPEATABLE READ以及LOCK IN SHARE MODEFOR UPDATE查询应该可以正常工作......

你们有什么感想?

4

2 回答 2

2

我建议阅读提交。一旦提交了其他会话的提交数据,就能够看到它们似乎很自然。

不清楚为什么 MySQL 有默认的 REPEATABLE READ。

于 2019-03-20T10:03:14.867 回答
-3

我认为您太担心隔离级别了。

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

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

于 2011-10-14T21:05:09.923 回答