IBX 控件 TIBtransaction 使用问题: 事务处理控制 急!急!!急!!!(68分)

  • 主题发起人 主题发起人 xczbb
  • 开始时间 开始时间
X

xczbb

Unregistered / Unconfirmed
GUEST, unregistred user!
原先通过BDE连接INTERBASE数据库,对其事务处理采用如下方式:
(query采用缓冲更新方法: query.cachedupdates:=true;)

database.starttransaction;
try
query.applyupdates;
except
database.rollback;
raise;
end;
database.commit;
query.commitupdates;


在我使用IBX后, 对interbase的事务处理遇到问题:
(ibdatabase和ibquery的默认事务处理为ibtransaction)

// ibtransaction.starttransaction 此句可省
// 因为ibquery.open自动执行了ibtransaction.starttransaction

try
query.applyupdates;
except
ibtransaction.rollback;
// 问题是: 它要关闭ibquery!!! 所有缓冲更新内容将丢失!!!
// 我使用的是interbase ver5.x 只能到interbase 6.0 后才能使用rollbackretaining !!!
raise;
end;
ibtransaction.CommitRetaining;


我看了delphi5中的DEMO,其ibmastapp程序中没有使用: ibTransaction.rollback; 而我的程序中
ibquery.applyupdates要更新多条记录,在其中一条记录更新出错的情况下,发现有部分记录已写
到数据库中(当然尚未提交,其他用户还看不到,但此时其他用户无法增加与已写到数据库中记录
key一样的记录); 此时选择两难:
1. 如果rollback, 所有缓冲更新将丢失,ibquery需重新打开.
2. 如果不rollback,其他用户不可能再增加已写到数据库中(未提交的)相同key的记录,且事务处理
时间太长(有改动而不提交).


另外,我试过用两个或多个ibtranaction,问题无法解决.


 
rollback之前,先创建一个buffer把缓冲区内容存下来吧。
看来只有手动工作了。
 
我查看了delphi的source,看到以下代码:

procedure TDatabase.ApplyUpdates(const DataSets: array of TDBDataSet);
var
I: Integer;
DS: TDBDataSet;
begin
StartTransaction;
try
for I := 0 to High(DataSets) do
begin
DS := DataSets;
if DS.Database <> Self then
DatabaseError(Format(SUpdateWrongDB, [DS.Name, Name]));
DataSets.ApplyUpdates;
end;
Commit;
except
Rollback; <========== !!!!!!!!!!!!!!!
raise;
end;
for I := 0 to High(DataSets) do
DataSets.CommitUpdates;
end;


procedure TIBDatabase.ApplyUpdates(const DataSets: array of TDataSet);
var
I: Integer;
DS: TIBCustomDataSet;
TR: TIBTransaction;
begin
TR := nil;
for I := 0 to High(DataSets) do
begin
DS := TIBCustomDataSet(DataSets);
if DS.Database <> Self then
IBError(ibxeUpdateWrongDB, [nil]);
if TR = nil then
TR := DS.Transaction;
if (DS.Transaction <> TR) or (TR = nil) then
IBError(ibxeUpdateWrongTR, [nil]);
end;
TR.CheckInTransaction;
for I := 0 to High(DataSets) do
begin
DS := TIBCustomDataSet(DataSets);
DS.ApplyUpdates; <=========找不到rollback
end;
TR.CommitRetaining;
end;


所以我决定,暂时放弃使用IBX,将程序改为用BDE(时间来不及了,本来说好上星期
完工的),还好,我改得不多!

那位高手有高招,请赐教!!!
 
附加功能 将问题提前
 
多人接受答案了。
 
后退
顶部