MySql 事务隔离级别
事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommitted) 是 是 是 读已提交(read-committed) 否 是 是 可重复读(repeatable-read) 否 否 是 串行化(serializable) 否 否 否
1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
MySql默认事务隔离级别是: 可重复读(repeatable-read)
在Oracle,SqlServer中都是选择 读已提交(Read Commited)作为默认的隔离级别
问题:为什么MySql默认设置的事务隔离级别是可重复读?
答:这要从主从复制说起,主从复制是基于binlog复制的。binlog主要有3种格式:
- statement:记录的是修改SQL语句
- row:记录的是每行实际数据的变更
- mixed:statement和row模式的混合
Mysql在5.0这个版本以前,binlog只支持 STATEMENT
这种格式!而这种格式在 读已提交(Read Commited)这个隔离级别下主从复制是有bug的,因此Mysql将 可重复读(Repeatable Read)作为默认的隔离级别!
5.1以后MySQL引入ROW格式,可以按行复制。因此由于历史原因,mysql将默认的隔离级别设为 可重复读(Repeatable Read),保证主从复制不出问题!
项目中是不用 读未提交(Read UnCommitted)和 串行化(Serializable)两个隔离级别,原因有二
- 采用 读未提交(Read UnCommitted),一个事务读到另一个事务未提交读数据,这个不用多说吧,从逻辑上都说不过去!
- 采用 串行化(Serializable),每个次读操作都会加锁,快照读失效,一般是使用mysql自带分布式事务功能时才使用该隔离级别!(因为这是XA事务,是强一致性事务,性能不佳!互联网的分布式方案,多采用最终一致性的事务解决方案!)
Original: https://www.cnblogs.com/zhuzhen/p/15990652.html
Author: 十七年蝉
Title: MySql 事务隔离级别简述,以及为什么互联网项目用:读已提交(Read Commited)这个隔离级别
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/620964/
转载文章受原作者版权保护。转载请注明原作者出处!