事务可以看作是不可分割的操作集合,集合中的操作要么全部完成,要么全部取消。一个
简单的例子是银行之间的转帐,从银行A 提款然后到银行B 存款,这两个操作如果有一个在操
作期间出现错误,就必须取消另外一个,而不管它是否成功。全部执行或者全部取消,是事务
的基本特征。
每个事务在运行期间分配一个私有缓冲区,当进行事务处理时,在缓冲区中进行。当事务
结束时,如果该事务所涉及的数据都能提交到数据库,更新就可以进行,否则在事务期间所作
的变化全部夭折。
如果要处理整体性操作,可以把它们放在事务中。D e l p h i 的事务处理过程相当简单,只要
调用D a t a b a s e 组件的方法:
S t a r t Tr a n s a c t i o n // 开始一个新的事务
C o m m i t // 向数据库服务器提交更新
R o l l b a c k // 取消事务期间作的改变,把数据库恢复到事务前状态
D a t a b a s e 组件的Tr a n s I s o l a t i o n 指定了作用于同一个表的事务的隔离程度,可以取下列值:
· tiDirtyRead 可以看到其他事务还没有提交的对数据库的修改。
· tiReadCommitted 只能看到其他事务已经提交的修改。
· tiRepeatableRead 在事务期间,数据的修改彼此不可见。
有些数据库服务器可能不支持所有的隔离模式。如果不支持每个模式,B D E 将使用数据库
服务器支持的下一个最高模式。I n t e r B a s e 不支持t i D i r t y R e a d 模式,指定t i D i r t y R e a d 时,实际上
使用t i R e a d C o m m i t t e d 模式。
事务处理的一般模式为:
. . .
D a t a b a s e 1 . S t a r t Tr a n s a c t i o n ;
t r y
ApplyUpdates; // 修改数据
D atabase1.Commit; // 提交数据
e x c e p t
Database1.Rollback; // 如果提交失败,回滚数据库
raise;
e n d ;