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

标签 mysql database postgresql transactions replication

我在一个具有典型 CRUD 网络使用模式的网站上工作:类似于用户创建/更新内容和其他用户阅读内容的博客或论坛。

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

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

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

你怎么看?有没有人试过在他们的 RDBMS 上使用“Read Uncommitted”?

最佳答案

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

更新 foo set bar=1 where id=1234;

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

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

OTOH,如果不严格需要一致的读取,那么使用未提交的读取可能是一个真正的收获,因为 Innodb 需要的锁更少。

至于回滚是否可能的问题,我认为您是最好的告诉我们的人,因为您是编写代码的人:)。

关于mysql - 对于典型的 Web 使用,将 MySQL 隔离设置为 “Read Uncommitted”(脏读)是否安全?即使有复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2025815/

相关文章:

mysql - 在hibernate mysql中批量插入/更新

php - 在 codeigniter php 中将博客页面标题显示为 url

mysql - 如何使用选择 AND

mongodb - Mongodump 和 mongorestore;未找到字段

mysql - 将 2 个表合并为 1 个

postgresql - pl/pgsql 中的一组值

java - 插入选择与批量插入

mysql - MYsql 中的子-父约束?

PostgreSQL WITH RECURSIVE 查询通过分区键获取有序的父子链

sql - Postgres 正则表达式替换为正则表达式和替换值使用另一个表