在自动提交模式下使用高隔离级别有什么意义?

时间:2014-07-11 21:30:57

标签: sql database isolation-level

我没有看到为什么高于READ COMMITTED的任何东西在自动提交模式下有用的原因。 Autocommit在每次查询后结束事务,然后在所选数据上释放获取的锁。如果锁不能在多个查询中存活,则无法执行一致的读取。因此,在自动提交模式下具有更高的隔离级别仅导致锁定更多数据=> BAD

这是对的吗?

2 个答案:

答案 0 :(得分:2)

您似乎假设单个语句始终是安全的,因为它只是一个语句。这不是真的。让我们举一个例子来直观地看到这一点。比较以下两个交易:

--A
select * from T where ID = 1
select * from T where ID = 2

--B
select * from T where ID IN (1, 2)

将两个读取塞进一个语句并不能避免任何并发问题(至少在所有RDBMS&es和存储引擎中都没有)。例如,这两个事务在SQL Server中具有相同的锁定和一致性属性。其他一些RDBMS使用MVCC进行每个语句。 MVCC不提供可串行化。只有在可串行化的情况下,您始终能够安全地解决并发问题。

您是否使用一个或两个语句没有任何区别。自动提交与否相同。

请注意,READ COMMITTED下的两个版本不可可序列化。所以你看到:有理由不同时使用READ COMMITTED和自动提交。

答案 1 :(得分:-1)

我可以回答关于MySQL实现的问题,与Oracle或PostgreSQL等其他品牌相比,它可能有不同的实现细节。

你是对的,如果可以,你应该使用READ COMMITTED。在MySQL中,它创建的锁比REPEATABLE READ少,如果只使用自动提交,那么就不需要REPEATABLE READ的一致事务读取视图。

在MySQL中,REPEATABLE READ是默认的事务隔离级别。这有点遗憾,因为它会产生更多的开销。

如果@MK假设读取同一行两次,则查看不同结果的单个语句不会有风险。即使在READ COMMITTED中,通过创建短期事务读取视图使每个语句成为“原子”。但它不会阻止并发更新。那是MVCC的神奇之处!

另见http://www.mysqlperformanceblog.com/2012/08/28/differences-between-read-committed-and-repeatable-read-transaction-isolation-levels/