2016 - 2024

感恩一路有你

数据库如何防止脏读 数据库哪个隔离级别可以实现脏读?

浏览量:1330 时间:2021-03-15 21:24:54 作者:admin

数据库哪个隔离级别可以实现脏读?

对于同时运行的多个事务,当这些事务访问数据库中的同一数据时,如果不采用必要的隔离机制,将导致各种并发问题:·脏读:对于两件事T1,T2,T1读取T2已更新但尚未提交的字段。之后,如果T2回滚,则T1读取的内容是临时的、无效的、不可重复的读取:对于两件事,T1,T2,T1读取一个字段,然后T2更新该字段。之后,T1再次读取相同的字段,并且值不同。·魔读:有两件事,T1,T2,T1从表中读取一个字段,T2在表中插入一些新行数据库事务的隔离:数据库系统必须具有隔离和运行各种并发事务的能力,这样它们就不会相互影响,避免了各种并发问题。事务与其他事务之间的隔离程度称为隔离级别,不同的隔离级别对应不同的干扰级别。隔离级别越高,数据一致性越好。但是,并发性越弱。数据库提供四个隔离级别:readuncommitted(readuncommitted data)允许事务读取其他事务未提交的更改。脏读、不可重复读和不真实读问题都发生在已提交的读取(已提交的读取数据)中,只允许事务读取其他事务已提交的更改,这样可以避免脏读。但是,由于不可重复读取和不真实读取,仍会发生可重复读取。可以避免从可序列化事务中重复读取同一字段的问题确保事务可以从表中读取同一行。在此事务期间,禁止其他事务插入、更新和删除该表。所有并发问题都可以避免,但性能非常低。Oracle支持两个事务隔离级别:read-committed、serializable。Oracle的默认事务隔离级别是read committed,MySQL支持4 MySQL的默认事务隔离级别是:repeatable read

下面简要解释一下原因:

锁定是因为操作不是原子的。我来解释一下。参见下面两个图。

我这个操作需要

看上面的第二个图,你能很清楚地理解这个过程吗?

锁定是为了确保上述三个步骤是原子操作。

回到问题上来,只有一个线程要写,没有竞争,所以不需要锁定。

但是,如果你看第一张图片,因为主内存和本地内存的存在

在一个线程写入后,其他线程无法立即看到它。这就是可见性问题。

添加volatile关键字后,它将在操作后强制工作内存和主内存同步,以确保其他线程可以立即看到它。

多个线程可以读一个变量,只有一个线程可以对这个变量进行写,到底要不要加锁?

脏读是指事务正在访问数据并对其进行修改。虚读是一种在事务没有独立执行时发生的现象。

数据库如何防止脏读 数据库脏读怎么解决 脏读 幻读 不可重复读 区别

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。