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

我理解的ACID

A(Atomicity):原子性,事务中的所有执行的操作任务,只能被全部应用或者全部弃用。比如说,删除一个表中的100条数据的过程中,如果在删除第50条数据的时候发现有其他表中的数据依赖这条记录,那么删除操作就无法进行下去,前面已经删除的49条数据也会被回滚。(这种错误现在可以用DML error logging技术解决具体可以参数我的一片帖子http://blog.csdn.net/renfengjun/article/details/8284873)

 

C(Consistency):一致性,事务会保证数据库的一致性状态。比如说在两个账户之间转账的过程中,如果操作过程中出现了异常错误,那么这个事务一定需要全部回滚,保持一致性状态,不能只影响其中的一个账户。

 

I(Isolation):隔离性,事务对数据库产生的影响在提交之前对于其他事务来说是不可见的。比如说,SessionA 更新了 emp表中scott的salary字段,这个更改的数据在SessionA没有提交以前,只有在SessionA才能看到,其他的Session只能看到emp表中scott的原始salary值。

 

我来列举一下事务执行过程中,会出现的几种情况,:

  • Dirty reads

       脏读,其他事务读取到了另外的事务更改的却没有提交的数据。

  • Nonrepeatable (fuzzy) reads

       因为其他事务更改了数据,一个事务中两次查询这一行数据的时候出现的结果不同。

  • Phantom reads

       因为其他事务更改了数据,一个事务中两次查询的结果集不同。

 

       事务隔离级别就是根据业务情况选择正确的级别来阻止上面列举的某些情况的发生。分为4个等级。与上面列举的情况的关系如下表所示:



Isolation Level

 

Dirty Read

Nonrepeatable Read

Phantom Read

Read cncommitted

Possible

Possible

Possible

Read committed

Not possible

Possible

Possible

Repeatable read

Not possible

Not possible

Possible

Serializable

Not possible

Not possible

Not possible

 

 

Oracle数据库中只支持ReadCommited和Serializable两种隔离级别。默认情况下Oracle数据库使用ReadCommited隔离级别,可以通过下面的命令设置隔离级别以及事务名称。

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
NAME 'update inventory checkpoint 0';

 

D(Durability):事务提交的数据必须是持久化的。事务完成后,数据库必须保证数据已经完整的保存在数据库中,并且不会因为其他原因丢失提交的数据。