从工程角度来谈谈数据库的四个隔离

(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会发现查询出来数据前后不一致,这个就是幻读(数量不一致)场景

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值