事务与InterBase的两个问题(100分)

  • 主题发起人 savetime
  • 开始时间
S

savetime

Unregistered / Unconfirmed
GUEST, unregistred user!
如果客户端开启了一个事务,并进行了一些数据修改,在未提交前客户端崩溃,这里服务器
如何得知该事务是应该Commit还是RollBack?

我现在学习InterBase,看到李维及其它大侠强调:事务期间一定要短,可是这样设计起来比较麻烦。
如果我使用ReadCommit模式,会妨碍其它用户吗?

请大侠指教。
 
无人回答?
 
我没有用过INTERBASE,只能就ORACLE来说。
如果一个事务在发出事务的一端由于某种原因下中断(比如断电,死机),SERVER是无法
知道是什么原因的,但是这个事务还是保留在SERVER端,因为SERVER以为发出事务的一端
仍然在连接(可能是出去喝杯咖啡)。但是,每一个事务在SERVER端都有一个最大的存在
时间,当此事务不活动的时期超过此时限,则按不同的设置进行COMMIT或者ROLLBACK。前者
是乐观设置,而后者是悲观设置,看你怎么弄了。
 
如果用户没有显式提交,则服务器都会将它回滚
Interbase的事务模式和其他的不同,
任何数据库操作,包括都区和更新都必须在一个事务中
我的程序中大量使用事务组件
保证各个事务不受影响
 
原则上, 你可以用Delphi的TDatabase控件中的Method:
StartTransaction, Commit, Rollback 来处理事务. 详细方法, 请叁看有关BDE的处理方
法, 我不想再重覆.
假如你是用DBGrid来处理数据, 不想逐次更新, 你更可以用 CacheUpdates := true;
然後使用 Applyupdates 或 Cancelupdates来批次存入更新或取消更新.

其实, Delphi的TDatabase并无给用户完全发挥Interbase的事务管理功效. 首先, Interbase
除了支援 TransIsolation := tiReadCommitted外,
也可以用更高级的 TransIsolation := tiRepeatableRead.
Interbase的事务是有别於其他传统的做法, 他的事务是用顺序的version number来分别不同
的更新事务, 所以他不需要用Lock Record方式也可以处理多用户同时更新事务. 详细情形
请叁看http://www.ibphoenix.com/main.nfs?a=ibphoenix&s=1040049938:7976&page=ibp_document
上面的文件.(只是全 E文的)

在Delphi上, 以IBO (http://www.ibobjects.com)来处理Interbase/Firebird最彻底, 除了
上述BDE的事务方式外, 他的TIB_Transaction 或TIBODatabase可以更精细来管理事务, 如
他可以细分事务如下:
· Close;
· Commit;
· Rollback;
· Refresh( CommitChanges: boolean );
· ChangeIsolation( NewIsolation: TIB_Isolation; CommitChanges: boolean );
· Pause/Resume;
· IB_Transaction.Close
等等. 平时我们只需呼叫 Autocommit := true; IBO便自行处理事务了, 远比BDE, IBX,
DbExpress更方便.

 
多人接受答案了。
 
顶部