对于典型的 Web 使用,将 MySQL 隔离设置为“未提交读取”(脏读)是否安全?即使有复制?

对于典型的 Web 使用,将 MySQL 隔离设置为“未提交读取”(脏读)是否安全?即使有复制?

我正在开发一个具有典型 CRUD 网络使用模式的网站:类似于博客或论坛,用户可以创建/更新内容并且其他用户阅读内容。

似乎可以将数据库的隔离级别设置为“读取未提交“(脏读) 在这种情况下。我对“读取未提交”的一般缺点的理解是,读取者可能会读取稍后将被回滚的未提交数据。

在 CRUD 博客/论坛使用模式中,是否会出现回滚?即使有,读取未提交的数据是否存在重大问题?

现在我没有使用任何复制,但是将来如果我想使用复制(基于行,而不是基于语句),“读取未提交”隔离级别会阻止我这样做吗?

您觉得如何?有人尝试过在 RDBMS 上使用“读取未提交”吗?

答案1

您可以安全地使用基于行的复制,但不能使用基于语句的复制。

答案2

READ UNCOMMITTED 的问题不是可能会回滚 - 至少这不是主要问题。主要问题是您可能会获得部分数据。例如,使用博客,假设您有一个汇总表,其中包含现有帖子的数量等。您还有一个表格,每篇帖子占一行。显然我在这里编造了一些东西 - 这不是您应该拥有的结构。

无论如何,在一个线程中,您启动一​​个事务,将摘要表中的帖子数量从 4 更新为 5,插入新的帖子行,然后提交事务。完美运行。

在另一个线程中,您读取了帖子数量并将博客显示到单个屏幕上。此查询(非常快)发生在 UPDATE 和 INSERT 语句之间。帖子数量显示为“5”,如果幸运的话,您有 4 个博客帖子。如果您的编码不走运,并且实际使用了摘要数字而不是仅仅显示它,那么您就遇到了数组溢出情况……

在大多数情况下,READ COMMITTED 就是您想要提供适当一致性的方式。

相关内容