美文网首页
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