首页 > 编程知识 正文

oracle数据库隔离级别,数据库四类隔离级别

时间:2023-05-04 19:38:57 阅读:32608 作者:358

数据库隔离级别文章目录数据库隔离级别问题脏读图不可重复读取图幻像读取与不可重复读取的区别解决思路序列化未提交读取简化比较隔离级别未提交读取提交读取重复读取序列化参考

问题

数据库从设计之初就要求满足ACID (原子性、一致性、独立性、持续性)四个特性,但同时读写时,如果不加以限制,往往会遇到奇怪的问题

脏读a事务读取b事务尚未提交的数据。 此数据是Web事务在处理过程中生成的脏数据,可能是临时状态。 你怎么理解这个临时的?

如果b在后续异常中回滚b的后续操作中存在对此数据的修改,则a读取的此数据可能不匹配。

发生脏读的条件是数据库允许尚未提交的事务读取已更改的数据。 这实际上损害了ACID中的隔离性和一致性

形象

不要重复在一个事务中前后读取的数据不匹配。

因为事务与事务之间是隔离的,所以事务必须从一个一致的状态迁移到另一个一致的状态。 如果在处理事务时发生中间状态(而不是自己触发的),则不能保证最后数据的一致性。

形象

幻像读取前后多次读取,数据总量不一致。 这是

不能重复读的幻读和不能重复读的区别是什么?

(1)不可重复读取由其他事务改变的数据,并对update操作执行

解决方案:使用行级锁定锁定行,并在事务a的多次读取操作完成后解除锁定。 此时,其他事务可以更改刚才的数据。

)幻读读取在其他事务中添加的数据,并对insert和delete操作执行幻读

解决方案:使用表级锁定来锁定整个表,事务a多次读取数据总量,然后解除锁定。 此时,其他事务可以添加数据。

解决方案简单来说,解决方案是对数据的读写施加一些限制。 最常见的是锁,确保同时读写的数据的安全性。

但是,由于总机fzdxh、锁和一些并发控制方案会带来性能损失,可能会降低并发数,当然不想看到这样的结果,所以为了平衡数据安全和性能,数据库为了满足不同场景的需要为了说明这种设计的初衷,我列举了隔离级别中最极端的两个例子

序列化简单来说就是在事务执行过程中保持与串行执行相同的效果。 最简单最不可能的实现方法是锁定。 a在事务执行之前锁定数据库,并在执行完成后释放。 在此期间,无法执行其他事务。

未提交的读取允许脏读,几乎没有并发控制。

简单对比一下上面两种方式,第一种数据非常安全,但性能很差。 第二,几乎没有同步控制,性能好,跑得很随意,但数据也非常混乱。

隔离级别这样看,为了平衡性能和数据安全,需要设计一些中间隔离级别。 以下是四个常见的数据隔离级别:

未提交读书简单来说,就是允许阅读未提交的事务所生成的中间数据。 也就是说,公开原谅脏领导。 当然,不能重复。 幻读在这种隔离水平下也是不可避免的。

提交读取只允许其他事务读取提交后的数据,从而避免脏读取。 但是,如果某个b事务在a事务执行过程中触发,并且数据发生了更改,则a事务在b事务执行前后读取的数据不匹配,会产生重复程度和幻读

重复读取可确保在单个事务的执行过程中前后读取的数据匹配。 这里的数据是数据项,而不是整个一批数据,因此如果b事务中添加了数据列,则a上一个读的可能还是一个记录,下一个可能是两个。

根据上面的介绍,重复阅读的隔离级别可以避免脏读和未提交的读,但幻读是不可避免的。

Mysql默认就是重复读的隔离级别

串行化可以借鉴解决思路中的串行化解释,串行化可以避免上述所有问题。 例如,污渍读取、不可重复读取、幻像读取。 虽然是终极解决方案,但成本也很高

参照事务隔离快速了解脏读、不可重复读、幻像读和MVCC

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。