数据库事务隔离级别的形象解释

事务的隔离级别

由低到高依次为Read uncommitted(读未提交)、Read committed(读已提交)、Repeatable read(可重复读取)、Serializable(序列化),前三个级别会出现脏读、不可重复读、幻读中的多个问题,后三个级别可以逐个解决脏读、不可重复读、幻读的问题。

(1)Read uncommitted(读未提交):

1)如果一个事务已经开始写某行数据,在其提交事务之前,其他事务则不允许同时对此行数据进行写操作,但允许其他事务读此行数据。这样以来,其他事务读取到未提交数据,出现脏读。
2)但是读取此行数据的事务不仅允许其他读事务访问该行数据,也允许其他写事务访问该行数据。这样就会出现不可重复读和幻读。
(读未提交:一个事务写某行数据时,允许其他事务对这行数据进行读,所以会出现脏读,事务T1读取T2未提交的数据)

(2)Read committed(读已提交):

1)如果一个事务已经开始写某行数据,在其提交事务之前,不仅不允许其他事务对此行数据进行写操作,同时也要禁止其他事务读取该行数据。这样相比“读未提交”来说,解决了脏读。
2)但是读取此行数据的事务不仅允许其他读事务访问该行数据,也允许其他写事务访问该行数据。这样就会出现不可重复读和幻读的问题。     
(读已提交:未提交的写事务将会禁止其他事务访问该行数据,避免了脏读;但是读此行数据的事务允许其他事务访问该行数据,会出现不可重复读;事务T1读取某行数据,T2紧接着更新此行数据并提交数据,事务T1再次读取此行数据的时候,和第一次读的不一样。不可重复读即虚读)

(3)Repeatable read(可重复读取):

1)写某行数据的事务禁止任何其他事务访问该行数据,避免了脏读。
2)读某行数据的事务只允许其他读事务访问该行数据,禁止其他写事务访问该行数据,这样就解决了不可重复读问题。
(可重复读:虽然设置该级别避免了不可重复读和脏读;但是会出现幻读:即在同一个读取事务中,第二次查询数据时会包含第一次查询中未出现的数据记录。)如果对幻读不太了解,可以查看另一篇文章:对数据库幻读的理解

(4)Serializable(序列化):

1)提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。这样就解决了幻读。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
2)序列化是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读。

原文地址:https://www.cnblogs.com/hzcya1995/p/13302463.html