对于典型的Web使用,将MySQL隔离设置为"Read Uncommitted"(脏读)是否安全?即使复制?

Con*_*ion 6 mysql database postgresql replication transactions

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

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

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

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

你怎么看?有人试过在他们的RDBMS上使用"Read Uncommitted"吗?

ggi*_*oux 3

MySQL 5.1 在使用未提交读和二进制日志记录(复制所需)时更加严格 - 因此您可能会在一些简单的更新/删除语句上遇到错误,而这些错误在默认隔离级别 REPEATABLE READ 中不会出现。我见过简单的PK更新,例如:

更新 foo set bar=1 其中 id=1234;

错误:mysql_real_query 错误 1598 消息:无法进行二进制日志记录。消息:InnoDB 中的事务级别“READ-UNCOMMITTED”对于 binlog 模式“STATMENT”不安全

因此,您必须准备好处理这个问题,方法是在修改数据时切换回可重复读取,或者使用单独的连接进行读取和写入,并具有自己的隔离级别。当/如果您的项目扩展并且需要复制时,后者可以派上用场,因此您可以将选择发送到只读从属设备并在主设备上写入。

OTOH,如果不严格需要一致读取,则使用未提交读进行读取可能会带来真正的好处,因为 Innodb 需要的锁更少。

至于是否可以回滚的问题,我认为您是告诉我们这一点的最佳人选,因为您是编码它的人:)。