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
使用DirtyRead的TransIsolation程度
xilREADCOMMITTED
使用ReadCommitted的TransIsolation程度
xilREPEATABLEREAD
使用RepeatableRead的TransIsolation程度
xilCUSTOM
使用定制的TransIsolation程度
本文参照李维的《Delphi数据库高效编程》
TransIsolation
意义
DirtyRead
代表目前的事务可以看得到其它事务对于数据的修改,即使其它事务还没有提交
ReadCommitted
代表这个事务只能看到已经被其它事务提交了的数据
RepeatableRead
这个保证可以看到一致性的数据
Serializable
最最严格的TransIsolation模式,代表数据库中的事务一个接一个执行。每个事务都看不到其它事务的影响。
IsolationLevel
意义
xilDIRTYREAD
使用DirtyRead的TransIsolation程度
xilREADCOMMITTED
使用ReadCommitted的TransIsolation程度
xilREPEATABLEREAD
使用RepeatableRead的TransIsolation程度
xilCUSTOM
使用定制的TransIsolation程度