我们知道不可重复读和幻读是因为并发执行多个事务时导致的"误读"的结果.很多时候我们无法区分不可重复读和幻读之间到底有什么不同.感觉大部分人的描述推到最后发现这两者都是同一个事务中前后读取的结果不一样.在此,我阐述一下我自己的理解
不可重复读和幻读都是一个事务在前后两次读取同一个记录集合时读取到的结果不一样.区别在于不可重复读读取到的结果不一样的原因是因为该记录集合中某些记录的值发生了改变;而幻读读取到的结果不一样的原因是因为该记录集合由于其他事务的写操作而导致该记录集合中多出了几条之前没有的纪录.
针对不可重复读,MySQL提供了read repeatable的隔离级别,表示可重复读.可重复读的意思是在同一个事务内部,后面的读操作读取的结果都是源于第一次读操作读取后生成的稳定的视图中的结果.换一种说法,在不可重复读的情况下,幻读是不可能发生的.因为前后读取到的结果一定是一致的.
幻读只出现在多次读操作读取的都是记录集合中最新的情况时.是指在多次读取的中间过程中,其他事务向该记录集合中插入了新的不曾出现过的记录.针对幻读,MySQL提供了serializable的隔离界别,表示序列化,即针对一个事务,只有该事务中的所有操作执行完之后,才允许其他事务执行.



