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,问题无法解决.
(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,问题无法解决.