日期:2014-05-16  浏览次数:20466 次

事务ACID区别【转】

转自:http://blog.sina.com.cn/s/blog_44c594a70101rsgj.html

1,最容易困惑的是原子性和一致性,先谈这俩:
原子性:事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。
一致性: 事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。
?

??? 有朋友会问,那我保证了原子性,不就可以保证一致了么?这里的关键区别在于,事务的操作边界定义。对于一直事务里有哪些操作,这个是自定义的,而一致性是 针对业务逻辑本身而言的。比如你定义一个事务,里面的操作是A,B,C三步,系统原子性能保证的是这三步要么都执行,要么都不执行,不可拆分。但是有可能 你这三部破坏了数据的一致性,比如你定义了从A账户划拨200块给B账户。如果你的事务里只包含从A账户扣款,而不包含B账户加钱。那么系统保证原子性 后,能保证要么从A账户都扣款成功,要么都不成功,不会出现扣了一半款之类的异常情况。但是没办法保证B账户加钱了。所以A账户扣款,B账号加钱,这是一 个连续的动作,业务逻辑上要保证一致性,所以必须把两个步骤放在一个事务里,这样才能保证一致性。
??? 换而言之,原子性是系统能够提供的功能,而一致性是根据业务逻辑,有用户自定义事务的边界来保证的。两者缺一不可。

2,隔离性
??? 其实这里还有一个隐含的点,就是可见性。注意区分两者的关系及隔离和可见的等级,这个是很好理解的。
3,持久性
??? 持久性也是有级别的,不是说所有数据库都能保证100%当事务提交后,就一定不会丢了。也是比较好理解,各个数据库实现不同,持久性的保证程度也不同。