(1)读取未提交
从字面上的意思来讲,这个应该很好理解,假设 A 事务操作X表在commit 之前,另一个事务B并行执行也操作X表,在A 事务commit之前,B能感受到A事务对X 表的修改(delete ,update之类操作)。这个隔离级别最低,相当于并行事务之间毫无隔离,当然在工程上可能只有对读操作类的存储过程之间具有存在价值。
(2)读取已提交
见字如其意,还是以A事务操作X表commit之前,另一个事务B并行执行也操作X表,在A事务commit之前,B事务是无法感知B能感受到A事务对X 表的修改(delete ,update之类操作)。这个隔离场景的实际应用价值(Oracle的默认隔离级别)能够应付大部分数据库事务,但是会引出另外一个不可重复读的问题,接下来我讲讲一个实际的工程示例:
(3)不可重复读 (虚读)
在A存储过程中有如下操作,从X表中查询一条记录,改记录是又一个标志位是标识是否可用,如果可用,则将该记录设置为不可用,然后存储过程返回该条记录ID。那么问题来了,如果两个并发线程执行A事务,那么设为1号线程和2号线程,在存储过程提交前,1和2认为该ID记录都可用,这样其实在其中过一个线程commit之前,另外一个线程也为认为该ID可用。这就是典型的虚读场景(即读取到update的数据)
(3)不可重复读(幻读)
幻读其实是读取到delete到和insert数据,A事务通过查询语句去匹配X表中若干条数据,而B事务中往X表中插入若干条数据,在B事务提交前后,A会发现查询出来数据前后不一致,这个就是幻读(数量不一致)场景