zoukankan      html  css  js  c++  java
  • mysql innodb 存储引擎的事务隔离级别

    事务隔离级别

    read uncommitted(未提交读),导致脏读。
    read committed(提交读),导致不可重复读。
    repeatable read(可重复读),导致幻读。
    serializable(序列化), 效率过低。

    我们的隔离级别都是针对多个事务操作同一数据来定义的,比如未提交读,那就是当前事务隔离级别设置为未提交读,那么其他事务中未commit的数据当前事务可以读取。

    默认的事务隔离级别是 repeatable read

    mysql> show variables like '%isolation%' ;
    +-----------------------+-----------------+
    | Variable_name         | Value           |
    +-----------------------+-----------------+
    | transaction_isolation | REPEATABLE-READ |
    | tx_isolation          | REPEATABLE-READ |
    +-----------------------+-----------------+
    

    表结构

    create table

    create table student(
     id int primary key,
     name varchar(255)
    
    );
    insert into student values(1,'student1');
    
    select * from student;
    

    read uncommitted(未提交读)

    客户端A

    set session transaction isolation level read uncommitted;
    start transaction;
    select * from student;
    
    

    客户端B

    set session transaction isolation level read uncommitted;
    set session transaction isolation level read committed;
    set session transaction isolation level repeatable read;
    set session transaction isolation level serializable;
    
    start transaction;
    update student set name ='student2' where id = 1;
    select *  from student ;
    rollback;
    

    只要客户端A的隔离级别为 read uncommitted,客户端B的隔离级别为任意级别,客户端A都会脏读。

    serializable(序列化)

    事务B阻塞

    客户端A 先执行

    set session transaction isolation level serializable;
    start transaction;
    select * from student;
    
    

    客户端B 后执行

    update student set name ='student2' where id = 1;  --将会阻塞
    

    客户端A阻塞

    客户端B 先执行

    start transaction;
    update student set name ='student2' where id = 1;  
    

    客户端A 后执行

    set session transaction isolation level serializable;
    start transaction;
    select * from student; --将会阻塞
    
    

    总结

    客户端 A B 事务A sql执行结果
    隔离级别 read uncommitted 任意 A读取出B事务中未提交的数据
    隔离级别 read committed 任意 A没有读出B事务中未提交的数据
    隔离级别 repeatable read 任意 A没有读出B事务中未提交的数据,并且在A开启事务后查询,无论B事务是否提交,读取的结果都是一致的。
    隔离级别 serializable 任意 A没有读取B事务中未提交的数据,并且在A开启事务查询后, B事务的更新相关数据会阻塞。B事务开启事务后并更新数据,A读取相关数据会阻塞。

    read uncommitted ,read uncommitted,repeatable read 都是读取数据,其他事务的隔离级别对其读取不会造成阻塞。
    serializable 可能由于其他事务更新数据,导致当前读取,更新相关数据 阻塞。

  • 相关阅读:
    HDOJ 5347 MZL's chemistry 【打表】
    自定义轮播图插件
    Twitter Bootstrap:前端框架利器
    左边定宽,右边自适应两列布局
    JS 断点调试心得
    关于将多个json对象添加到数组中的测试
    普通选项卡+自动播放功能+向前/向后按钮 原生js
    线程队列、事件以及协程
    GIL锁、进程池与线程池、同步异步
    JoinableQueue类与线程
  • 原文地址:https://www.cnblogs.com/alway-july/p/13556365.html
Copyright © 2011-2022 走看看