我正在开发一个具有典型 CRUD 网络使用模式的网站:类似于博客或论坛,用户可以创建/更新内容并且其他用户阅读内容。
似乎可以将数据库的隔离级别设置为“读取未提交“(脏读) 在这种情况下。我对“读取未提交”的一般缺点的理解是,读取者可能会读取稍后将被回滚的未提交数据。
在 CRUD 博客/论坛使用模式中,是否会出现回滚?即使有,读取未提交的数据是否存在重大问题?
现在我没有使用任何复制,但是将来如果我想使用复制(基于行,而不是基于语句),“读取未提交”隔离级别会阻止我这样做吗?
您觉得如何?有人尝试过在 RDBMS 上使用“读取未提交”吗?
答案1
您可以安全地使用基于行的复制,但不能使用基于语句的复制。
答案2
READ UNCOMMITTED 的问题不是可能会回滚 - 至少这不是主要问题。主要问题是您可能会获得部分数据。例如,使用博客,假设您有一个汇总表,其中包含现有帖子的数量等。您还有一个表格,每篇帖子占一行。显然我在这里编造了一些东西 - 这不是您应该拥有的结构。
无论如何,在一个线程中,您启动一个事务,将摘要表中的帖子数量从 4 更新为 5,插入新的帖子行,然后提交事务。完美运行。
在另一个线程中,您读取了帖子数量并将博客显示到单个屏幕上。此查询(非常快)发生在 UPDATE 和 INSERT 语句之间。帖子数量显示为“5”,如果幸运的话,您有 4 个博客帖子。如果您的编码不走运,并且实际使用了摘要数字而不是仅仅显示它,那么您就遇到了数组溢出情况……
在大多数情况下,READ COMMITTED 就是您想要提供适当一致性的方式。