引用:https://developer.aliyun.com/article/743691 讲的很棒,所以摘抄过来,侵权必删
简介: MySQL的事务隔离级别一共有四个,分别是读未提交、读已提交、可重复读以及可串行化。
事前准备数据
mysql> create table city( -> id int(10) auto_increment, -> name varchar(30), -> primary key (id) -> )engine=innodb charset=utf8mb4;insert into city(name) values('武汉市');mysql> select * from city;+----+-----------+| id | name |+----+-----------+| 1 | 武汉市 |+----+-----------+
事务并发可能出现的情况
脏读(Dirty Read)
一个事务读到了另一个未提交事务修改过的数据
不可重复读(Non-Repeatable Read)
一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据进行一次修改并提交后,该事务都能查询得到最新值。(不可重复读在读未提交和读已提交隔离级别都可能会出现)
幻读(Phantom)
一个事务先根据某些条件查询出一些记录,之后另一个事务又向表中插入了符合这些条件的记录,原先的事务再次按照该条件查询时,能把另一个事务插入的记录也读出来。(幻读在读未提交、读已提交、可重复读隔离级别都可能会出现)
事务的隔离级别
MySQL的事务隔离级别一共有四个,分别是读未提交、读已提交、可重复读以及可串行化。
MySQL的隔离级别的作用就是让事务之间互相隔离,互不影响,这样可以保证事务的一致性。
隔离级别比较:可串行化>可重复读>读已提交>读未提交
隔离级别对性能的影响比较:可串行化>可重复读>读已提交>读未提交
由此看出,隔离级别越高,所需要消耗的MySQL性能越大(如事务并发严重性),为了平衡二者,一般建议设置的隔离级别为可重复读,MySQL默认的隔离级别也是可重复读。