数据库事务隔离级别

    事务隔离,顾名思义,就是为了减少多个并行事务之间操作而产生的影响,由于影响的程度不同划分出了四个级别,分别是READ_UNCOMMITTED(1)、READ_COMMITED(2)、REPEATABLE_READ(4)、SERIALIZABLE(8)。至于影响程度,主要包括三个,分布是读脏数据、不可重复读以及幻读。

    1.    影响程度

    -    读脏数据

       事务1修改了某行数据,但是还没有提交该事务,事务2此时读取了该修改的数据,过了一会儿,事务1那边出现了某种异常就回滚了事务,那么之前修改的数据又回到了从前,但是事务2此时并不知道,仍然使用修改后的数据,此时,该数据就是脏数据,也就是在那个时间点根本不存在的数据;

    -    不可重复读

      事务1中存在多次的读操作,第一次读了一条数据然后做其他事了,此时,事务2对该数据进行了修改,过了一会儿,事务1处于某种需求又去读那一条数据,发现此时读取的数据和第一次读取的不一样了。这种不是因为同一事务的操作而引起的同一数据多次读取结果不一致的就是不可重复读现象。

   -    幻读

      事务1第一次去读取或者更新了在某种条件下的10条记录,然后又去做其他事了,此时事务2添加或者删除了其中的几条记录,过了一会儿,事务1回来了再次读取或者更新同样条件的数据,发现此时操作的记录数和之前的比起来不一样,觉得这个很诡异,像产生了一种幻觉一样,这就是幻读。

    2.    隔离级别

  -    READ_UNCOMMITTED  (读未提交)

      对并行事务间的交叉操作不做任何的控制,任其来回穿梭。这样的好处是性能好,没有锁在数据对象上,那么开销就会小很多;不好就是会出现读脏数据、不可重复读、幻读这些问题。

-    READ_COMMITED(读提交)

       这是为了避免读脏数据的一种隔离级别,通过在读取的那条记录上加了S锁,读取完后就释放该锁。这样在读取一条数据的时候,并不会受到其他事务对该数据对象的影响,也就是说读取的数据要么是旧的数据,要么是其他事务修改后已经提交的数据。但是,并不能保证同一事务中多次读取到相同的记录(引起不可重复读)。这是ORACLE默认的数据隔离级别。

-    REPEATABLE_READ(重复读)

    设置该级别是为了避免不可重复读的现象,对事务中所读取的数据行加S锁并且在事务结束后释放,其他事务在该锁释放之前是不能对该数据做任何修改的。但是,这种方式,并不能阻止其他事务添加新的记录,如果添加的数据记录正好处于当前事务的查询范围内,那么就会出现幻读的现象。这是MYSQL默认的数据隔离级别。

- SERIALIZABLE(序列化)

    通过添加范围锁来锁住整个表直到事务结束,防止其他事务在锁期间做任何的操作,这样是最安全的,可以防止读脏数据、不可重复读以及幻读的发生。

    以上的四个级别通过不同的加锁范围来减少并行事务之间的影响,但是,隔离级别的大小与性能的大小成反比,锁加的范围越大性能就越低,因此 READ_UNCOMMITTED和SERIALIZABLE这两种级别基本上没有被使用。


一家之言,如有不对,敬请赐教!

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