!!!关于TDataSetProvider中的事务处理的问题!!!(100分)

  • 主题发起人 主题发起人 chillkwanjane
  • 开始时间 开始时间
C

chillkwanjane

Unregistered / Unconfirmed
GUEST, unregistred user!
我在学习MIDAS,在学习过程中遇到一个问题,觉得TDataSetProvider的事务处理好象有点奇怪:
在客户端调用ApplyUpdates以前,如果AppServer处于显式事务状态中,则Client调用
ApplyUpdates后,AppServer的DataSetProvider不会调用DataSet的PSEndTransaction,
也就是说发生错误,没有立即回滚,而即使不发生错误,也不会提交事务。
--如果是这样的话,是不是有问题呢?
我没有试过,我是看TDataSetProvider.InternalApplyUpdates的代码提这个问题的,
请各位给我解答这个疑惑,谢谢
=========================================================================
注:我的DataSet组件是针对MsSqlServer的(不是Delphi提供的),
在PSInTransaction中的代码大致是:
begin
InternalQuery.Close;
InternalQuery.Sql.Text := 'select @@trancount as f0';
InternalQuery.Open;
Result := InternalQuery.Fields[0].AsInteger > 0;
InternalQuery.Close;
end;
而PSStartTransaction的代码则会启动一个显式事务,
另外,我的Provider的设置是ResolveToDataSet为True.
=========================================================================

为方便各位讨论,转帖Delphi7中关于该过程的代码:
function TDataSetProvider.InternalApplyUpdates(const Delta: OleVariant;
MaxErrors: Integer;
out ErrorCount: Integer): OleVariant;
override;
begin
CheckDataSet;
//如果此时我的DataSet.PSInTransaction返回True, 则fTransactionStarted = False
fTransactionStarted := not IProviderSupport(DataSet).PSInTransaction;
//则不再启动事务
if fTransactionStarted then
IProviderSupport(DataSet).PSStartTransaction;
try
CheckResolver;
Resolver.fUpdateTree.InitData(DataSet);
try
Result := inherited InternalApplyUpdates(Delta, MaxErrors, ErrorCount);
finally
Resolver.fUpdateTree.InitData(nil);
end;
finally
//因为fTransactionStarted = False, 所以不Commit也不Rollback,是这样吗?
if fTransactionStarted then
IProviderSupport(DataSet).PSEndTransaction(
(ErrorCount <= MaxErrors)
or
(MaxErrors = -1)
);
end;
end;

 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
738
SUNSTONE的Delphi笔记
S
后退
顶部