美文网首页
MYSQL默认事务隔离级别

MYSQL默认事务隔离级别

作者: 晚歌歌 | 来源:发表于2019-04-17 16:38 被阅读0次

    一、MYSQL四种事务隔离级别

    事务隔离级别 脏读 不可重复读 幻读
    读未提交(read-uncommitted)
    读已提交(read-committed)
    可重复读(repeatable-read)
    串行化(serializable)
    • 脏读:一个事务读取另外一个事务还没有提交的数据叫脏读【针对未提交的数据】

    • 不可重复读:即在同一个事务内,两个相同的查询返回了不同的结果【读取数据本身的对比】

    • 幻读:即解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性),因此同一个事务同样的SELECT操作读到的结果会是一致的,但是,如果另一个事务同时提交了新数据或删除数据,本事务再更新时,就会发现了这些新增或缺少数据【同一事务A多次查询,若另一事务B只是update,则A事务多次查询结果相同;若B事务insert/delete数据,则A事务多次查询就会发现新增或缺少数据,出现幻读,即幻读关注读取结果集条数变化】
      MySQL的可重复读级别能解决幻读吗

    二、Mysql默认的事务隔离级别是可重复读(Repeatable Read),但互联网项目中一般用读已提交(Read Commited)

    互联网项目中mysql应该选什么事务隔离级别

    原因:

    • 在RR隔离级别下,存在间隙锁,导致出现死锁的几率比RC大的多
    • 在RR隔离级别下,条件列未命中索引会锁表,而MySQL对RC做了优化,在MySQL Server过滤条件,发现不满足后,会调用unlock_row方法,把不满足条件的记录放锁。
    • 在RC隔离级别下,半一致性读(semi-consistent)特性增加了update操作的并发性

    Oracle,SqlServer中都是选择读已提交(Read Commited)作为默认的隔离级别。
    项目中是不用读未提交(Read UnCommitted)和串行化(Serializable)两个隔离级别,原因有二:

    • 采用读未提交(Read UnCommitted),一个事务读到另一个事务未提交读数据,即脏读,逻辑上就是有问题的
    • 采用串行化(Serializable),每次读操作都会加锁,快照读失效

    相关文章

      网友评论

          本文标题:MYSQL默认事务隔离级别

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