为了更好地理清类似脏读、不可重复读、幻读,未提交读、提交读、可重复读、串行化等概念,必需有这样一个认识:即这些概念都是属于数据库四大特性之一——隔离级别下的内容。而所谓的"隔离",当然是为了把问题给隔离和解决掉,而不同的隔离级别解决的便是不同级别的问题。可大致表示为4种隔离级别分别隔离4种问题
尽是问题 (丢失修改)
未提交读—————————————————————————————— (隔离线)
脏读问题
提交读————————————————————————————————
不可重复读问题
可重复读——————————————————————————————
幻读问题
串行化————————————————————————————————
从上可知,隔离级别 "可重复读" 解决的是问题 "不可重复读" ,但不能解决幻读。串行化可以解决所有问题,而对应的未提交读几乎什么问题都解决不了,只能解决最基本的丢失修改。
当然这是一般的情况,如果是Innodb引擎,由于引入了MVCC多版本并发控制和Next-Key Lock等锁机制,从而使得隔离级别 "可重复读" 也能解决幻读问题,那么也就变成了如下
尽是问题 (丢失修改)
未提交读—————————————————————————————— (隔离线)
脏读问题
提交读————————————————————————————————
不可重复 + 幻读问题
可重复读/串行化————————————————————————————————
下面便讲解下每种隔离级别解决对应问题的原理
[ 读前应知道:
共享锁,又称S锁、读锁,事务A对一个资源加了S锁后其他事务仍能共享读该资源,但不能对其进行写,直到A释放锁为止。
排它锁,又称X锁、写锁,事务A对一个资源加了X锁后只有A本身能对该资源进行读和写操作,其他事务对该资源的读和写操作都将被阻塞,直到A释放锁为止 ]
1> 未提交读(READ_UNCOMMITED)解决丢失修改
[ 丢失修改:多个事务同时盯上了一个数据,然后各写各的,谁把谁覆盖了都不知道,总之谁写的快谁就会被覆盖丢失信息。]
为了解决丢失修改的写覆盖问题,