关于这四个隔离级别的介绍:mysql
未提交读(READ UNCOMMITTED)。另外一个事务修改了数据,但还没有提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)。sql
提交读(READ COMMITTED)。本事务读取到的是最新的数据(其余事务提交后的)。问题是,在同一个事务里,先后两次相同的SELECT会读到不一样的结果(不重复读)。session
可重复读(REPEATABLE READ)。在同一个事务里,SELECT的结果是事务开始时时间点的状态,所以,一样的SELECT操做读到的结果会是一致的。可是,会有幻读现象(稍后解释)。并发
串行化(SERIALIZABLE)。读操做会隐式获取共享锁,能够保证不一样事务间的互斥。性能
这四个级别逐渐加强,每一个级别解决一个问题测试
脏读,最容易理解。另外一个事务修改了数据,但还没有提交,而本事务中的SELECT会读到这些未被提交的数据。spa
不重复读。解决了脏读后,会遇到,同一个事务执行过程当中,另一个事务提交了新数据,所以本事务前后两次读到的数据结果会不一致。事务
幻读。解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。可是,若是另外一个事务同时提交了新数据,本事务再更新时,就会“惊奇的”发现了这些新数据,貌似以前读到的数据是“鬼影”同样的幻觉。it
仍是经过测试结果来讲明这些问题吧,如下结果基于mysql的版本是 5.1.53。io
READ UNCOMMITTED
SessionA
SessionB
ps:从结果可知,在sessionA尚未commit的时候,SessionB就已经能够读取到update的数据,尽管没有commit.这就会致使“脏读".
READ-COMMITTED
ps:sessionA只有提交以后,sessionB才能够读取update的数据,这就避免了'脏读',可是仍是存在问题,那就是不可重复读。sessionB在同一个事务中,两次读取的数据不一致。
REPEATABLE READ
ps: 经过设置可重复读隔离级别,解决了同一个事务中屡次读取数据不一致的问题,
可是仍是存在问题,那就是'幻读', 举例说明,事务A在insert以前发现表里面没有数据,因而就准备insert数据,与此同时,事务B insert数据到表里面而且已经commit.
这个时候事务A继续insert, 若是某个字段有惟一约束,则insert的时候冲突。
SERIALIZABLE
ps:这个就解决了幻读的问题,可是影响了并发读写性能,sessionA得到了共享锁,sessoinB是挂起的状态,只有sessionA commit以后,sessionB才能够update(不超时的前提下)。