数据库的隔离级别

数据库的事务隔离级别

前提

事务说明:

数据库是一个共享资源,可供多个用户使用。允许多个用户同时使用的数据库系统称为多用户数据库系统。例如:银行数据库系统、机票订票数据库系统等。并发控制的产生是由于共享的要求,即多个用户程序并发存取同一数据。并发控制单位是事务。当多个用户并发地存取数据库数据时,就可能会产生多个事务同时存取同一数据的情况。若对并发操作不加控制,就可能会导致读和写不正确的数据,破坏数据库的一致性并发控制的核心问题是在保证数据库一致性的前提下最大限度地提高并发度。

ACIDIsolate,顾名思义就是将事务与另一个事务隔离开,为什么要隔离呢?如果一个事务正在操作的数据被另一个事务修改或删除了,最后的执行结果可能无法达到预期。如果没有隔离性还会导致其他问题。

数据准备:

account表,两个用户,都存储1000元。
在这里插入图片描述

查看隔离状态:

-- mysql默认  repeatable read
show variables like '%isolation%'; 

1. 读未提交(Read uncommitted)

一个事务可以读取另一个未提交事务的数据,最低级别,任何情况都无法保证,会造成脏读

演示:

  • 设置隔离级别

    set session transaction isolation level read uncommitted;
    
  • 同时开启两个事务,事务A将tom的钱增加1000,不提交,事务B不提交,查看。发现事务B可以读取事务A为提交的内容

在这里插入图片描述

2. 读已提交(Read committed)

一个事务要等另一个事务提交后才能读取数据,可避免脏读的发生,会造成不可重复读
演示:

  • 设置隔离级别

    set session transaction isolation level read committed;
    
  • 同时开启两个事务,事务A将tom的钱增加1000,不提交,事务B不提交,查看,不会读取到事务A的内容。将事务A提交,事务B不提交,查看。会出现不可重复读。

在这里插入图片描述

3. 可重复读(Repeatable read)

​ 就是在开始读取数据(事务开启)时,不再允许修改操作,可避免脏读、不可重复读的发生,但是会造成幻读
演示:

  • 设置隔离级别

    set session transaction isolation level repeatable read;
    
  • 同时开启两个事务,事务A将tom的钱增加1000,不提交,事务B不提交,查看,不会读取到事务A的内容。将事务A提交,事务B不提交,查看,两次查询的 数据一致。事务B提交,查询的数据变了,出现了幻读。

    在这里插入图片描述
    在这里插入图片描述

4. 串行(Serializable)

是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

  • 设置隔离级别

    set session transaction isolation level serializable;
    
  • 同时开启两个事务,事务A查询,事务B查询,数据一致。事务B再查询,数据不变,事务A进行修改,无法进行,由于数据隔离级别,只有事务B提交,事务A才能进行修改。事务A提交,事务可以进行修改了。事务A未提交,事务B已经提交,事务查询,数据一致。未出现幻读的情况. 加入锁的,不允许事务B读取数据,未提交,而事务A直接进行修改。
    在这里插入图片描述


版权声明:本文为weixin_48917089原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。