美文网首页sql
事务隔离级别

事务隔离级别

作者: IT雪山 | 来源:发表于2021-04-06 14:03 被阅读0次

    SQL 标准定义了四种隔离级别,MySQL 全都支持。这四种隔离级别分别是:
    从上往下,隔离强度逐渐增强,性能逐渐变差

    1 读未提交(READ UNCOMMITTED

    MySQL 事务隔离其实是依靠锁来实现的,加锁自然会带来性能的损失。而读未提交隔离级别是不加锁的,所以它的性能是最好的,没有加锁、解锁带来的性能开销。但有利就有弊,这基本上就相当于裸奔啊,所以它连脏读的问题都没办法解决。

    2 读提交 (READ COMMITTED

    读提交就是一个事务只能读到其他事务已经提交过的数据,也就是其他事务调用 commit 命令之后的数据。那脏数据问题就解决了。读提交事务隔离级别是大多数流行数据库的默认事务隔离界别,比如 Oracle,但是不是 MySQL 的默认隔离界别

    3 可重复读 (REPEATABLE READ)

    事务不会读到其他事务对已有数据的修改,即使其他事务已提交,也就是说,事务开始时读到的已有数据是什么,在事务提交前的任意时刻,这些数据的值都是一样的。但是,对于其他事务新插入的数据是可以读到的,这也就引发了幻读问题。

    4 串行化 (SERIALIZABLE)

    串行化是4种事务隔离级别中隔离效果最好的,解决了脏读、可重复读、幻读的问题,但是效果最差,它将事务的执行变为顺序执行,与其他三个隔离级别相比,它就相当于单线程,后一个事务的执行必须等待前一个事务结束。

    截屏2021-04-06 10.17.40.png

    查看事务隔离级别
    show variables like 'transaction_isolation';
    设置全局事务隔离级别
    set global transaction isolation level read committed;
    设置当前会话事务隔离级别
    set session transaction isolation level repeatable read;

    互联网项目中mysql该如何选择

    Mysql默认的事务隔离级别是可重复读(Repeatable Read),那互联网项目中Mysql也是用默认隔离级别,不需要修改吗?
    先说结论:互联网项目请用:读已提交(Read Commited)这个隔离级别!

    Read UnCommitted:一个事务读到另一个事务未提交读数据,肯定不合适
    Serializable:每个次读操作都会加锁,快照读失效,性能不佳
    原因一:
    在RR隔离级别下,存在间隙锁,导致出现死锁的几率比RC大的多!
    原因二:
    在RR隔离级别下,条件列未命中索引会锁表!而在RC隔离级别下,只锁行

    相关文章

      网友评论

        本文标题:事务隔离级别

        本文链接:https://www.haomeiwen.com/subject/nolskltx.html