- 脏读:从另一个事务中读取未提交的数据
- 不可重复读取:
UPDATE
从另一个事务的查询中读取COMMITTED数据
- 幻像读取:从
INSERT
或DELETE
其他事务查询中读取提交的数据
注意:在某些情况下,来自另一个事务的DELETE语句引起非重复读取的可能性也很小。不幸的是,当DELETE语句删除当前事务正在查询的同一行时,就会发生这种情况。但这是一种罕见的情况,在每个表中都有数百万行的数据库中更不可能发生。在任何生产环境中,包含事务处理数据的表通常具有很高的数据量。
我们还可以观察到,在大多数用例中,UPDATE可能是更频繁的工作,而不是实际的INSERT或DELETES(在这种情况下,仅存在不可重复读取的危险- 在那些情况下不可能进行幻像读取)。这就是为什么对UPDATES与INSERT-DELETE的区别对待,并且所产生的异常也被不同地命名的原因。
处理INSERT-DELETE而不是仅处理UPDATES还带来额外的处理成本。
- READ_UNCOMMITTED不会阻止任何操作。零隔离级别
- READ_COMMITTED仅防止一次读取,即脏读
- REPEATABLE_READ防止两个异常:脏读和不可重复读
- SERIALIZABLE防止所有三种异常:脏读,不可重复读和幻像读
那么,为什么不始终设置事务SERIALIZABLE呢?好了,以上问题的答案是:SERIALIZABLE设置使交易非常缓慢,而我们再次不希望这样做。
实际上,交易时间消耗的速率如下:
可SERIALIZABLE > REPEATABLE_READ > READ_COMMITTED > READ_UNCOMMITTED
因此READ_UNCOMMITTED设置是最快的。
摘要
实际上,我们需要分析用例并确定隔离级别,以便我们优化事务处理时间并防止出现大多数异常情况。
请注意,默认情况下,数据库具有REPEATABLE_READ设置。