`
zyslovely
  • 浏览: 231509 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

数据库事务___脏读、幻读、不可重复读

 
阅读更多
事务(transaction)是数据库管理系统的执行单位,可以是一个数据库操作(如Select操作)或者是一组操作序列。事务ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
原子性:保证事务中的所有操作全部执行或全部不执行。例如执行转账事务,要么转账成功,要么失败。成功,则金额从转出帐户转入到目的帐户,并且两个帐户金额将发生相应的变化;失败,则两个账户的金额都不变。不会出现转出帐户扣了钱,而目的帐户没有收到钱的情况。
一致性:保证数据库始终保持数据的一致性——事务操作之前是一致的,事务操作之后也是一致的,不管事务成功与否。如上面的例子,转账之前和之后数据库都保持数据上的一致性。
隔离性:多个事务并发执行的话,结果应该与多个事务串行执行效果是一样的。显然最简单的隔离就是将所有事务都串行执行:先来先执行,一个事务执行完了才允许执行下一个。但这样数据库的效率低下,如:两个不同的事务只是读取同一批数据,这样完全可以并发进行。为了控制并发执行的效果就有了不同的隔离级别。下面将详细介绍。
持久性:持久性表示事物操作完成之后,对数据库的影响是持久的,即使数据库因故障而受到破坏,数据库也应该能够恢复。通常的实现方式是采用日志。

事务隔离级别(transaction isolation levels):隔离级别就是对对事务并发控制的等级。ANSI/ ISO SQL将其分为串行化(SERIALIZABLE)、可重复读(REPEATABLE READ)、读已提交(READ COMMITED)、读未提交(READ UNCOMMITED)四个等级。为了实现隔离级别通常数据库采用锁(Lock)。一般在编程的时候只需要设置隔离等级,至于具体采用什么锁则由数据库来设置。首先介绍四种等级,然后举例解释后面三个等级(可重复读、读已提交、读未提交)中会出现的并发问题。
串行化(SERIALIZABLE):所有事务都一个接一个地串行执行,这样可以避免幻读(phantom reads)。对于基于锁来实现并发控制的数据库来说,串行化要求在执行范围查询(如选取年龄在10到30之间的用户)的时候,需要获取范围锁(range lock)。如果不是基于锁实现并发控制的数据库,则检查到有违反串行操作的事务时,需要滚回该事务。
可重复读(REPEATABLE READ):所有被Select获取的数据都不能被修改,这样就可以避免一个事务前后读取数据不一致的情况。但是却没有办法控制幻读,因为这个时候其他事务不能更改所选的数据,但是可以增加数据,因为前一个事务没有范围锁。
读已提交(READ COMMITED):被读取的数据可以被其他事务修改。这样就可能导致不可重复读。也就是说,事务的读取数据的时候获取读锁,但是读完之后立即释放(不需要等到事务结束),而写锁则是事务提交之后才释放。释放读锁之后,就可能被其他事物修改数据。该等级也是SQL Server默认的隔离等级。
读未提交(READ UNCOMMITED):这是最低的隔离等级,允许其他事务看到没有提交的数据。这种等级会导致脏读(Dirty Read)。


1. 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。

2. 不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。

3. 幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。

补充 : 基于元数据的 Spring 声明性事务 :

Isolation 属性一共支持五种事务设置,具体介绍如下:

l          DEFAULT 使用数据库设置的隔离级别 ( 默认 ) ,由 DBA 默认的设置来决定隔离级别 .

l          READ_UNCOMMITTED 会出现脏读、不可重复读、幻读 ( 隔离级别最低,并发性能高 )

l          READ_COMMITTED  会出现不可重复读、幻读问题(锁定正在读取的行)

l          REPEATABLE_READ 会出幻读(锁定所读取的所有行)

l          SERIALIZABLE 保证所有的情况不会发生(锁表)

不可重复读的重点是修改 :
同样的条件 ,   你读取过的数据 ,   再次读取出来发现值不一样了
幻读的重点在于新增或者删除
同样的条件 ,   第 1 次和第 2 次读出来的记录数不一样
分享到:
评论

相关推荐

    并发控制指的是当多个用户同时更新行时,用于保护数据库完整性的各种技术。并发机制不正确可能导致脏读、幻读和不可重复读等此类问题。

    并发控制的主要目标是避免事务之间的冲突,防止出现诸如脏读、不可重复读和幻读等问题。 脏读发生在事务T1读取了事务T2还未提交的修改数据,然后T2因为某种原因回滚了更改。在这种情况下,T1读到的数据实际上是错误...

    脏读不可重复读幻影读

    脏读、不可重复读和幻读都是在事务隔离性不足的情况下可能出现的问题。 1. **脏读**(Dirty Read): - **定义**:当一个事务正在访问数据,并对该数据进行了修改,但这种修改还没有提交到数据库中时,另一个事务...

    事务并发处理分析 (举例祥解: 脏读 不可重复的读 虚读)

    在事务并发处理中,存在三种类型的问题:脏读、不可重复读和虚读。 脏读(Dirty Read)是指事务读取了另一个事务未提交的数据。如果第一个事务回滚了修改操作,那么第二个事务读取的数据就可以看作是从未存在过的。...

    数据库锁(行锁,表锁,共享锁,排他锁)脏读、不可重复读、幻读和事物隔离级别

    1. 读未提交(Read Uncommitted):允许读取未提交的数据,可能导致脏读、不可重复读、幻读。 2. 读提交(Read Committed):仅能读取已提交的数据,避免脏读,但仍可能遇到不可重复读和幻读。 3. 可重复读...

    数据库事务总结 数据库事务总结

    - 描述:最低级别的隔离,允许读取未提交的更改,可能会遇到脏读、不可重复读和幻读等问题。 - 示例:如果事务A修改了数据但未提交,事务B能够读取到这些更改。 2. **读已提交(Read Committed)**: - 描述:不...

    SQL中 各种事务级别 和 脏读 不可重复读 幻读问题代码示例

    该资源详细介绍了MySQL数据库中的事务隔离级别,包括读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable),并讨论了这些级别如何影响脏读、不可重复读...

    数据库的脏读、不可重复读、幻读

    数据库的脏读、不可重复读、幻读都和事务的隔离性有关。所以先了解一下事务的4大特性。  事务的4大特性(ACID):  1、原子性(Atomicity):事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么...

    C#数据库事务原理及实践

    隔离性是确保并发事务之间的操作不会互相干扰,避免脏读、不可重复读和幻读等问题。SQL Server 2000 提供了多种事务隔离级别,如读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable ...

    50 听起来很恐怖的数据库幻读,到底是个什么奇葩问题?l.pdf

    为了深入理解幻读,我们首先要清楚几个基础概念:脏写、脏读、不可重复读。 脏写是指两个并发事务同时对同一数据项进行修改,一个事务还没有提交,另一个事务也修改了这个数据项,随后一个事务回滚,导致另一个事务...

    数据库系统实验五_事务编程_ssd7exercise9_

    不同的隔离级别可以防止诸如脏读、不可重复读和幻读等问题,但同时也会影响性能。例如,串行化虽然提供了最高的数据一致性,但可能导致并发度降低。 接着是"deadlock.txt",这是关于数据库死锁的问题。当两个或更多...

    数据库_事务隔离级别与锁.docx

    - **读已提交**:避免了脏读,但仍可能出现不可重复读和幻读。 - **可重复读**:解决了不可重复读的问题,但在某些情况下仍会出现幻读。 - **序列化**:避免了所有并发问题,但可能导致大量的锁等待,影响系统性能。...

    02.Spring支持的常用数据库事务传播属性和事务隔离级别.zip

    4. SERIALIZABLE(序列化):最高级别的隔离,完全避免了脏读、不可重复读和幻读,但性能较低,因为它对并发性进行了最严格的限制。 在Spring中,通过`@Transactional`注解的`isolation`属性可以设置事务隔离级别,...

    Spring Boot数据库事务控制.zip

    不同的隔离级别对应不同的并发问题,如脏读、不可重复读和幻读,开发者需要根据业务需求选择合适的隔离级别。 6. **事务嵌套**:在同一个事务中调用另一个@Transactional方法,Spring会处理这种事务嵌套。默认情况...

    数据库2018_数据库复习知识点.docx

    并发操作可能导致数据不一致性问题,例如丢失修改、不可重复读和读脏数据。为解决这些问题,数据库管理系统使用并发控制技术,如封锁、时间戳、乐观控制法和多版本并发控制。封锁是通过加锁机制防止并发冲突;时间戳...

    mysql数据库事务隔离级别借鉴.pdf

    - **读未提交(Read Uncommitted)**:最低的隔离级别,允许事务读取其他事务未提交的数据,因此可能会出现脏读、不可重复读和幻读。 - **读已提交(Read Committed)**:事务只能看到其他事务已经提交的更改,防止...

    数据库事务与隔离技术

    - **读已提交**:每次读取的数据都是其他事务已经提交的,避免了脏读,但可能出现不可重复读和幻读。 - **可重复读**:在事务内多次读取同一数据,结果始终一致,防止不可重复读,但幻读仍然可能发生。 - **串行...

    spring常用数据库事务传播属性和事务隔离级别1

    5. **Isolation.SERIALIZABLE**:最高的隔离级别,完全避免了脏读、不可重复读和幻读,但性能最差,因为需要锁定事务涉及的所有行。 在实际应用中,开发者需要根据业务需求来选择合适的事务传播属性和隔离级别,以...

    数据库 事务

    数据库事务是数据库操作的核心概念,它是数据库管理系统执行过程中的一个逻辑工作单位,包含了对数据库的一系列操作。在数据库系统中,事务确保数据的一致性和完整性,使得即使在系统出现故障或者并发操作的情况下,...

    数据库基础数据库事务处理.pptx

    Read Uncommitted是指允许脏读的隔离级别,Read Committed是指避免脏读的隔离级别,Repeatable Read是指避免不可重复读的隔离级别,Serializable是指避免幻读的隔离级别。 并发控制 并发控制是指数据库系统中对多...

Global site tag (gtag.js) - Google Analytics