数据库(针对MySQL)中不可重复读与幻读的区分

数据库(针对MySQL)中不可重复读与幻读的区分

1、不可重复读

    不可重复读指的是,在同一个事务中采用同一个SQL语句前后读取的数据集合不一致。

    举例来说:现有并行的两个事务,事务1和事务2。

    t1时刻:事务1和事务2通过SELECT * FROM user WHERE name = 'martin';事务1和事务2此时都能从数据库中读取出完全相同的一条记录('martin',21,'m');

    t2时刻:事务1通过DELETE FROM user WHERE name='martin';删除了数据库中的名叫martin的用户,并将该事务进行提交(commit);

    t3时刻:事务2再次通过SELECT * FROM user WHERE name = 'martin';发现数据库中不存在名叫martin的用户。

    根据数据库对隔离性(Isolation)的定义:事务中的操作对其它事务而言是隔离的,事务的执行不受其它其它事务的干扰。从上面的三个时刻可以看出,事务1的删除操作影响了事务2的读操作(事务2第二次没能读到第一次读到的martin用户)。所以不可重复读违背了数据库的隔离性

2、幻读

    幻读解决了不可重复读的问题,实现了可重复读,但由于事务相互间不干扰,造成了某事务对数据的增、删、改对另一个并行的事务而言是完全不可知的,这样就产生了幻读的问题。

    举例来说:现有两个并行的事务,事务1和事务2(这两个事务在不同的客户端开启)

    t1时刻:事务1和事务2通过SELECT * FROM user;得到了完全相同的20条记录;

客户端1,打开事务1:

数据库(针对MySQL)中不可重复读与幻读的区分_第1张图片

客户端2,打开事务2:

数据库(针对MySQL)中不可重复读与幻读的区分_第2张图片

    t2时刻:事务2执行DELETE FROM user WHERE name='martin';删除了数据库中的名叫alice的用户,并将该数据库进行提交(commit);

数据库(针对MySQL)中不可重复读与幻读的区分_第3张图片

    t3时刻:事务1通过SELECT * FROM user;得到了与时刻1完全相同的20条记录,其中也包括了t2时刻由事务2删除的名叫alice的用户的记录。事务1的读到了本应该本删除的记录,对毫不知情的事务1而言在外人看来就遇到了幽灵(phantom),此时便产生了幻读。

数据库(针对MySQL)中不可重复读与幻读的区分_第4张图片

    上面的例子这是通过DELETE操作产生了幻读问题,同理可以也可以通过类似的分析,在执行UPDATE、INSERT操作后,也会产生幻读现象。

你可能感兴趣的:(数据库)