Mysql有四种隔离级别,这些隔离级别用来限定哪些是可见的,哪些是不可见的,隔离级别越低并发越高,Mysql中默认的隔离级别是可重复读,下面我们来一一介绍下这四种隔离级别。
1.Read uncommitted
未提交读,就是说在一个事物中可以读取另一个事务中未提交的数据,这会导致,一个事务读取另一个事务未提交的数据,然后又回滚了,读取了错误的数据,造成脏读。
2.Read committed
已提交读,是指在一个事务只能看到已经提交的事务改变,这会导致前后两次读取数据不一致的情况,造成不可重复读。
3.Repeatable read
可重复读,同一事务读取数据时,能看到相同的数据,但是这会发生另一个现象幻读。
4.Serializable
串行化,这是最高的事务隔离界别,事务按照顺序一个一个执行,这样就避免了幻读,但是这会导致超时等问题。
脏读:读到未提交可能回滚的数据。
不可重复读:多次读取间,由于其他事务改变了数据,读到了不同的数据。
幻读:读到了,读到了之前不存在的数据,或者之前存在的数据消失了。
总结:不可重复读侧重于修改,幻读侧重于新增或删除
一些概念:
快照读:读取到的是历史版本。如普通的select;
当前读:读取到的是最新版本。如update、insert、delete、select for update;
悲观锁:总是认为别人会去修改数据,比如select for update;
乐观锁:总是认为别人不会去修改数据,表中增加版本号字段,类似于cas
Records Lock记录锁:select for update
Gap Lock间隙锁:索引前后加锁
Next-Key Lock:索引记录加锁,并且索引前间隙加锁
MVCC:保证同一个事务中读取的数据是同一版本,解决了不可重复读问题;
Gap+Next-Key:可以阻止其他事务在锁定区间插入数据,解决了幻读问题;