1. 脏读
含义:在事务过程中,读到了其它事务未提交的数据。
一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象的叫作"脏读"(Dirty Reads)。
简答来说,读取了其他事务未提交的数据
解决方法:将数据库事务提升到提交读或以上的隔离级别。
2. 不可重复读
含义:一次事务中,两次读操作中,读出来的数据内容不一致。
一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了!这种现象就叫作“ 不可重复读”(Non-Repeatable Reads)。
解决方法:将数据库事务提升到可重复读或以上的隔离级别。
3. 幻读
含义:一次事务中,两次读操作中,读到的数据行数不一致。读到了新增或者读不到删除的语句。
一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”(Phantom Reads)。
解决方法:将数据库事务提升到序列化(串行化)
或以上的隔离级别。
注:幻读和不可重复读很像但有区别。幻读是事务1操作过程中,有新数据添加提交了。再读时会出现新数据。不可重复读是,事务1操作过程中,之前读过的数据被修改或删除了。
4. 丢失修改(脏写)
含义:多个事务同时对数据进行修改,其中一个事务的数据被另一个事务的操作覆盖,导致丢失修改。如果一个事务修改了另一个未提交事务修改过的数据,那就意味着发生了 脏写
解决:脏写这个问题太严重了,不论是哪种隔离级别,都不允许脏 写的情况发生。
四种隔离级别:
READ UNCOMMTTED(未提交读):
一个事务在执行过程中可以看到其他事务没有提交的新插入的记录,而 且能看到其他事务没有提交的对已有记录的更新。
READ COMMITED(已提交读):
一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且能看到其他事务已经提交的对已有记录的更新。
REPEATABLE READ(可重复读,默认):
一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他其他事务对已有记录的更新。
SERIALIZABLE(串行化):
一个事务在执行过程中完全看不到其他事务对数据库所做的更新。(事务执行的时候不允许别的事务并发执行。事务串行化执行,事务只能一个接着一个地执行,而不能并发执行)
解决方法:锁
在写写环境下,MySQL会通过锁来保证并发修改的正常。