数据库事务的隔离级别有4种,为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。试验验证,假设有两个sql客户端开启事务。sql1和sql2:
假设存在account表:
1.Read uncommitted (set session transaction isolation level read uncommitted; )
sql1 update以后,select是中间状态username='lily', sql2也是,说明select到了中间的脏数据。如果sql1 rollback,则两边的select数据又变回了username = 'john';
2.Read committed (set session transaction isolation level read committed; )
sql1的update还没有commit,sql2读取的还是以前的john值。不会是中间的状态。
一旦sql1 commit,则sql2能读取的新的username = 'lily'; 说明read committed能避免脏读,但是无法避免重复读。
3.Read committed (set session transaction isolation level repeatable read;)
sql1对account的john name更新,sql2不变,还是john。
sql1 commit后,sql2还是读取的john,等到sql2 commit以后,再select,此时为lily。
sql1事务update以后,sql2的update会阻塞。说明不同的事务,读取的都是一个值,只有其他事务自己提交以后,才能读取到最新的值
3.Read committed (set session transaction isolation level serializable;)
serializable 可以避免幻读,在sql1没有commit之前,sql2无法得知sql1 insert or delete了。