程序的魔法

  :: 首页 :: 博问 :: 闪存 :: :: 联系 :: :: 管理 ::

DBExpress中隔离性含义   
   

    从Delphi6开始,Borland公司就推出了新一代的数据库访问技术dbExpress。

它是一组新的组件,技术和驱动程序,程序员可以使用它连接到各种数据库。 


    在开发数据库应用的过程中,我们经常要使用到数据库库的事务管理功能,一般

来说数据库的事务管理必须提供  原子性(Atomic)、一致性(Consistent)、

离性(Isolated)和持久性(Durable)。在这里,主要讨论一下隔离性的含义。

首先,我们需要介绍一下数据库库中的数据可能处于的三种状态:

1)Dirty Read

Dirty Read状态指的是一个客户端在激活数据库事务之后,会读取其它的事务已经

修改过的但是还没有提交(commit)到数据库中的数据。例子如下:某客户端通过事

务修改数据库中某一数据;同时,另一个客户端也通过事务查询这个数据;如果第一

个客户决定取消事务进行回滚,那么第二个客户查询的就是第一个客户尚未提交的数

据,这个数据其实是不存在的。

 

2)Nonrepatable Read

Nonrepatable Read状态指的是在一个事务中会取得不一致的数据,但是这个状态可

以正确取得其它事务提交(commit)的数据。

例子如下(直接采用李维的例子):

ü       用户A激活了一个2阶段的事务,在第一阶段中他查询了X部门的Delphi

程序员的工资数据 

ü       用户B激活并完成了一个事务,在这个事务中用户B修改了X部门中的 

Delphi程序员的工资数据

ü       用户A完成了她的事务,并且在这个事务的第二阶段中用户A再度查询X 

部门中的Delphi程序的工资数据,以计算Dephi程序员的平均工资。 

如果没有正确设置,那么A用户将会在两次读取中取得不一致的数据。

 

3)Phantom   Phantom其实是Nonrepatable Read的变体,理解的例子如下:

ü       用户A激活一个事务,他查询X部门中Delphi程序员的工资数据

ü       用户B激活并且完成一个事务,一个这个事务在X部门中新增了Delphi程序员

的记录

ü       用户A完成了她的事务,并且在这个事务的最后用户A再度查询X部门中Delphi

程序员的工资数据,以计算delphi程序员的平均工资。

   在上面的情形中当用户A执行事务之后,它在步骤3中会读取到一个新的Delphi程

序员记录,但这个记录在先前的记录中没有出现,所以,这个新记录就好像影子一

样突然出现。

 

前面讲了不少了,下面要做一个总结。我们以表格形式表示如下

TransIsolation

意义

DirtyRead

代表目前的事务可以看得到其它事务对于数据的修改,即使其它事务还没有提交

ReadCommitted

代表这个事务只能看到已经被其它事务提交了的数据

RepeatableRead

这个保证可以看到一致性的数据

Serializable

最最严格的TransIsolation模式,代表数据库中的事务一个接一个执行。每个事务都看不到其它事务的影响。

 

下面我们再来谈谈IsolationLevel这个属性把,到这里理解它的含义应该比

较容易了。

 

下面依然使用一个表来表示

 

IsolationLevel

意义

xilDIRTYREAD

使用DirtyReadTransIsolation程度

xilREADCOMMITTED

使用ReadCommittedTransIsolation程度

xilREPEATABLEREAD

使用RepeatableReadTransIsolation程度

xilCUSTOM

使用定制的TransIsolation程度


                               本文参照李维的《Delphi数据库高效编程》

posted on 2005-05-01 17:03  BlueMagic  阅读(709)  评论(0编辑  收藏  举报