数据库的隔离级别

定义:
在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别。

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted(未授权读取、读未提交)、Read committed(授权读取、读提交)、Repeatable read(可重复读取)、Serializable(序列化),这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。


问题的提出:
之所以提出事务隔离级别,是因为在一个事务执行过程中,可能会出现以下几种情况:

1、更新丢失
两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。
2、脏读
一个事务读取到了另一个事务未提交的数据操作结果。
3、不可重复读(Non-repeatable Reads):一个事务对同一行数据重复读取两次,但是却得到了不同的结果。
包括以下情况:
(1) 虚读:事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时得到与前一次不同的值。
(2) 幻读(Phantom Reads):事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。


下面介绍一下这几种事务隔离级别的区别以及可能出现的问题:

Read uncommitted(未授权读取、读未提交):

 直译就是"读未提交",意思就是即使一个更新语句没有提交,但是别 
的事务可以读到这个改变.这是很不安全的.     避免了更新丢失,却可能出现脏读

Read committed(授权读取、读提交):

 直译就是"读提交",意思就是语句提交以后即执行了COMMIT以后 
别的事务就能读到这个改变.  该隔离级别避免了脏读,但是却可能出现不可重复读。

Repeatable read(可重复读取)

 直译就是"可以重复读",这是说在同一个事务里面先后执行同一个 
查询语句的时候,得到的结果是一样的.  避免了不可重复读取和脏读,但是有时可能出现幻读

Serializable(序列化)

 直译就是"序列化",意思是说这个事务执行的时候不允许别的事务 
并发执行.    不仅可以避免脏读、不可重复读,还避免了幻像读。


隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。


大多数数据库的默认级别就是Read committed,比如Sql Server , Oracle。
MySQL的默认隔离级别就是Repeatable read。

你可能感兴趣的:(数据库的隔离级别)