C# 事务的ACID隔离级别

事务的ACID属性如下:

原子性(Atomicity):事务的所有操作是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。原子性消除了系统处理操作子集的可能性。

一致性(Consistency):数据从一种正确状态转换到另一种正确状态。事务在完成时,必须使所有的数据都保持一致。在相关数据库中,所有规则都必 须应用于事务的修改,以保持所有数据的完整性。当事务结束时,所有的内部数据结构都必须是正确的。在存款取款的例子中,逻辑规则是,钱是不能凭空产生或销 毁的,对于每个(收支)条目必须有一个相应的抵衡条目产生,以保证账户是平的。

隔离性(Isolation):由并发事务所作的修改必须与任何其他并发事务所作的修改隔离。查看数据时数据所处的状态,要么是事务修改它之前的状态,要 么是事务修改它之后的状态。简单的理解就是,防止多个并发更新彼此干扰。事务在操作数据时与其他事务操作隔离。隔离性一般是通过加锁的机制来实现的。

持久性(Durability):事务完成之后,它对于系统的影响是永久性的。已提交的更改即使在发生故障时也依然存在。

其中的隔离性,并不总是需要的。有时候处于性能的考虑,可以降低隔离要求。但必须了解改变隔离级别所带来的问题。

如下:

1.脏读取:

脏读又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的。

解决办法:用锁,锁定要改变的记录

2.不能重复的读取操作:

当数据在T1事务处理中读取,而在T1运行的同时,另一个事务处理T2,修改了T1中读取的数据,此时就会出现不能重复的读取操作,如果数据在T1多次读取,那么结果就会不同。

解决办法:用锁,锁定读取的记录

3.幻影读取:

幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行, 就好象发生了幻觉一样。

解决办法:用锁,范围锁定。

什么是锁?

锁就是防止其他事务访问指定的资源的手段。锁是实现并发控制的主要方法,是多个用户能够同时操纵同一个数据库中的数据而不发生数据不一致现象的重要保障。 一般来说,锁可以防止脏读、不可重复读和幻觉读。

在我们定义隔离时,可以通过IsolationLevel枚举定义隔离级别(TransactionIsolationLevel)。

隔离级别 说明
ReadUncommitted  使用ReadUncommitted,事务处理不会相互隔离,使用这个级别,不需要等待其他事务处理释放锁定的记录,可以从其他事务处理中读取未提交的数据--脏读取,这级别仅用于读取临时修改不太重要的记录,例如报表。
ReadCommitted ReadCommitted等待其他事务处理释放对记录的写入锁定,这样就不会出现脏读取操作,这个级别为读取当前的记录设置读取锁定,为写入的数据设置写入锁定,直到事务处理完成,对于要读取的记录,在移动到下一个记录上时,每个记录都是未锁定的,所以可能出现“无法重复的读取操作”。
RepeatableRead RepeatableRead为读取的记录设置锁定,直到事务处理完成为止,这样就避免了不可“无法重复的读取”的问题,但是幻影读取仍可能发生。
Serializable Serializable设置范围锁定,在运行事务处理时,不能向所读取的记录范围内,添加新记录。
Unspecified Unspecified表示,提供程序使用另一个隔离级别通道,它不同于IsolationLevel的枚举值。
Snapshot Snapshot只能用于sql server2005 以后的版本,在复制修改的纪录时,这个级别会减少锁定,这样其他事务处理就可以读取旧数据,不需等待解锁。
Chaos Chaos类似于ReadUncommitted,除了执行与ReadUncommitted 值的操作外,他不能锁定更新的记录。

常用的事务处理隔离级别:

隔离级别 脏读取 不可重复的读取 幻影读取
ReadUncommitted  Y Y Y
ReadCommitted N Y Y
RepeatableRead N N Y
Serializable N N N

  

参考网址:http://www.cnblogs.com/zhouqianhua/archive/2011/04/15/2017049.html

时间: 2024-10-11 15:43:53

C# 事务的ACID隔离级别的相关文章

数据库事务中的隔离级别和锁+spring Transactional注解

数据库事务中的隔离级别和锁 数据库事务在后端开发中占非常重要的地位,如何确保数据读取的正确性.安全性也是我们需要研究的问题. ACID 首先总结一下数据库事务正确执行的四个要素(ACID): 原子性(Atomicity):即事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做,不能只做一部分:一致性(Consistency):在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是处于正确的状态,即数据完整性约束没有被破坏:比如我们做银行转账的相关业务,A转账给B,要求

数据库事务的四大特性以及事务的隔离级别-与-Spring事务传播机制&隔离级别

本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响. ⑵ 一致性(Consistency) 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执

MySQL事务四个隔离级别

MySQL事务隔离级别详解             MySQL数据结构SQL SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Uncommitted (读取未提交的内容)  在该隔离级别,所有事务都可以看到其他未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取未提交的数据,也被称之为脏读(Dirty Read).Read Commit

事务并发之隔离级别

事务 事务是作为单个逻辑工作单元执行的一系列操作.一个逻辑工作单元必须有四个属性,称为原子性.一致性.隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务. 事务并发 数据库是多个用户(事务)共享的,当多个用户同时访问数据时,那么在这种情况下就叫做并发. 事务并发下可能出现的问题 更新丢失 两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了.这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来. 脏读 一个事务读取到了另一个事务未提交的数据操作结果.

数据库 之 事务控制和隔离级别

1  概述 事务是指一组原子性的SQL查询.或者是一个或多个SQL语句组成的独立工作单元:MyISAM不流行的原因很大是因为其不支持事务的处理功能. 2  事务日志 事务日志定义属性,有些参数可以运行时修改,写入在配置段里,事务日志相当于是中间的辅助功能,而且很关键. 事务日志表示把操作过程一笔一笔记录下来.如某个线程要对某个行操作,数据库会先保留老版本于事务日志中,对文件的写入,新版本的内容是先写入到日志里,提交前,数据在日志文件中,而不是在数据文件中,提交操作执行后,才将新旧版本的日志清除.

事务管理、隔离级别,日志管理

事务Transactions:一组原子性的SQL语句,或一个独立工作单元事务日志:记录事务信息,实现undo,redo等故障恢复功能ACID特性:A:atomicity原子性:整个事务中的所有操作要么全部成功执行,要么全部失败后回滚C:consistency一致性:数据库总是从一个一致性状态转换为另一个一致性状态I:Isolation隔离性:一个事务所做出的操作在提交之前,是不能为其它事务所见:隔离有多种隔离级别,实现并发D:durability持久性:一旦事务提交,其所做的修改会永久保存于数据

事务与Mysql隔离级别

事务 定义: 比如ABCD四个业务,作为一个事务,他们要么一起都执行完毕,要么都不执行.(只要有一个不成功,那么所有的都不可以成功) 四个特性 ACID 原子性(Atomicity) 整个事务中的所有操作,要么全都完成,要么全部不完成. 事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态. 一致性(Consistency) 事务必须保持系统处于一致的状态,不管在任何时间并发事务有多少. 比如转账,ABCDE五个人每个人初始状态 有 100元,总额是500元. 互相转账的操作

深入解析Mysql中事务的四大隔离级别及其所解决的读现象

本文详细介绍四种事务隔离级别,并通过举例的方式说明不同的级别能解决什么样的读现象.并且介绍了在关系型数据库中不同的隔离级别的实现原理. 在DBMS中,事务保证了一个操作序列可以全部都执行或者全部都不执行(原子性),从一个状态转变到另外一个状态(一致性).由于事务满足久性.所以一旦事务被提交之后,数据就能够被持久化下来,又因为事务是满足隔离性的,所以,当多个事务同时处理同一个数据的时候,多个事务直接是互不影响的,所以,在多个事务并发操作的过程中,如果控制不好隔离级别,就有可能产生脏读.不可重复读.

Spring事务中的隔离级别

TransactionDefinition接口中定义了五个表示隔离级别的常量: TransactionDefinition.ISOLATION_DEFAULT:使用后端数据库默认的隔离界别,MySQL默认采用的REPEATABLE_READ隔离级别,Oracle默认采用的READ_COMMITTED隔离级别. TransactionDefinition.ISOLATION_READ_UNCOMMITTED:最低的隔离级别,允许读取,允许读取尚未提交的的数据变更,可能会导致脏读.幻读或不可重复读.