Atomic Consistent Isolated Durable
An atomic
database transaction is one which is guaranteed to complete successfully or not at all. If an error prevents a partially-performed transaction from proceeding to completion, it must be "backed out" to prevent the database being left in an inconsistent state.
ACID is an acronym used to describe the properties that a transaction should have in an enterprise environment. A transaction should be Atomic, and its results should be Consistent, Isolated, and Durable. A transaction is Atomic if it either completes itself or is completely undone. The results of a transaction should consistently change the system from one state to another, be isolated or independent of one another, and, once completed, be durable or permanent. 什么是事务
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。
事务的结束有两种,当事务中的所以步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消撤消之前到事务开始时的所以操作。
事务的ACID
事务具有四个特征:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)。这四个特性简称为ACID特性。
1、原子性
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
2、一致性
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。
3、隔离性
一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4、持续性
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
事务的属性
一个事务的属性控制了事务的使用范围。EJB、Spring以及.net下的事务属性都很类似的,事务属性有如下几种:
Required:
如果在一个事务中调用,就把该方法加到此事务中来,如果还没有启动事务,就启动一个新事务。
RequiredNew:
不管当前有没有事务,都会启动一个新事务,如果当前有事务,会被挂起直到方法结束。
NotSupported:
不能在事务中执行此方法。如果有事务,将会被挂起直到方法结束。
Supports:
如果当前有事务,此方法会加到当前事务,如果没有,容器也不会启动新事务。
Mandatory:
必须在事务中调用此方法,否则抛出异常。
Never:
必须不在事务中调用此方法,否则抛出异常。
三.事务的回滚
CMT在以下两中情况下,事务将回滚。第一,如果产生一个系统异常,容器将自动回滚该事务。第二,通过调用EJBContext接口SetRollbackOnly方法,Bean方法通知容器回滚该事务。如果Bean抛出一个应用异常,事务将不会自动回滚,但可以调用SetRollbackOnly回滚。
五.隔离级别
事务不仅保证事务界限内的数据库操作全部完成(或回滚)同时还隔离数据库更新语句。隔离级别描述被修改的数据对其他事物的可见度。隔离级别的控制会跟具体的DBMS厂商不同而不同。
隔离级别与并发性是互为矛盾的:隔离程度越高,数据库的并发性越差;隔离程度越低,数据库的并发性越好。
通过一些现象,可以反映出隔离级别的效果。这些现象有:
l 更新丢失(lost update):当系统允许两个事务同时更新同一数据是,发生更新丢失。
l 脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。
l 非重复读(nonrepeatable read):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。
l 幻像读(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。
SQL-99 标准定义了下列隔离级别:
l 未提交读(read uncommitted)(隔离事务的最低级别,只能保证不读取物理上损坏的数据)
l 已提交读(read committed)(数据库引擎 的默认级别)当一个事务运行在这个隔离级别时,一个 SELECT 查询只能看到查询开始之前提交的数据,而永远无法看到未提交的数据,或者是在查询执行时其他并行的事务提交做的改变。
l 可重复读(repeatable read),不会脏读和非重复读,可能发生幻像读
l 可序列化(serializable)(隔离事务的最高级别,事务之间完全隔离)
posted on 2006-03-28 23:30
北国狼人的BloG 阅读(320)
评论(0) 编辑 收藏 所属分类:
达内学习总结