脏读(Dirty read):允许一个事务去读取另一个事务中未提交的数据,如果一个事务发生改变稍后回滚,那么之前的事务读取到的数据是无效的
例如: 余额10000元, 老婆网购1000,剩余9000 (此事务没有提交) 老公请客吃饭1000,余额8000,(事务提交)突然老婆不想买了,回滚事务,此时余额为8000
不可重复读(Nonrepeatable read):
一个事务中发生了两次读操作,第一次读操作和第二次操作之间,另外一个事务对数据进行了修改,这时候两次读取的数据是不一致的。
例如:老公无法读取老婆的未提交的9000元余额,故消费后仍为9000元,这样就消除了脏读带来的问题,但也会引发新的问题
幻读(Phantom read):幻读是一个事务读取几行记录后,另一个事务插入了一些记录,幻读就发生了。在后来的查询中第一个事务就会发现有一些原来没有的额外的记录。
ISOLATION_DEFAULT:使用数据库默认的隔离级别。
ISOLATION_READ_UNCOMMITTED:允许读取改变了的还未提交的数据,可能导致脏读、不可重复读和幻读。
ISOLATION_READ COMMITTED:允许并发事务提交之后读取,可以避免脏读,可能导致不可重复读和幻读。
ISOLATION_REPEATABLE_READ:对相同字段的多次读取结果一致,可导致幻读。
ISOLATION_SERIALIZABLE:完全服从ACID的原则,确保不发生脏读、不可重复读和幻读。
从脏读到序列化,系统性能直线下降,因此设置高的级别,如序列化,会严重压制并发,引起大量的线程挂起。对于脏读风险又过大,大部分场景下,企业会选择读/写提交的方式设置事务,这样既有助于提高并发,又压制了脏读,但是对于数据一致性问题并没有解决,要知道如何去克服这类问题。
隔离级别是Isolation.DEFAULT,对于不同的数据库,隔离级别的支持是不一样的,如MYSQL支持4种隔离级别,默认是可重复读的隔离级别,而Oracle只能支持读/写提交和序列化两种隔离级别,默认为读/写提交
网友评论