起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 254|回复: 9

代码启动流程并加入事务的问题

[复制链接]
发表于 2009-8-3 15:06:41 | 显示全部楼层 |阅读模式
procedure UserStartFlow (AFlowUrl,ADept,ARole,APerson,AStartProc,AFlowID,ASubject,ADescription:string);
var
  lBizURL: TBizURL;
  lFlowValue: TFlowValue;
  lFlowControl: TFlowControl;
  lExecutor: TOrgURL;
  lHandle: TTransactionHandle;
begin
  lBizURL := TBizURL.Create;
  lFlowValue := TFlowValue.Create;
  lFlowControl := TFlowControl.Create(Self.Context);
  lExecutor := TOrgURL.Create(ADept, ARole, APerson);
  lBizURL.URL := AFlowUrl;
  lHandle:= lFlowControl.FlowManager.Transaction.Start(True);
  try
    lFlowValue.IDs.Add(AFlowID);            //流程ID
    lFlowValue.Subject := ASubject;          //流程主题
    lFlowValue.Description := ADescription;   //流程描述
    try
      //启动流程实例
      lFlowControl.StartupFlow(lBizURL, AStartProc, lExecutor, lFlowValue);
      //流程实例数据保存到数据库
      lFlowControl.FlowRunnerbyIndex[0].CurrentTask.SaveToDB;
      lFlowControl.FlowManager.Transaction.Commit(lHandle);
    except
      lFlowControl.FlowManager.Transaction.Rollback(lHandle);
    end;
  finally
    lFlowControl.Free;
    lFlowValue.Free;
    lBizURL.Free;
  end;
end;


不加事务处理代码没有任何问题, 一旦使用事务控制,产生的流程和任务数据将不完整,TFLOWID表中没有相关记录

如果这样不对, 怎样确保启动流程和业务数据处理在同一个事务中

版本:3019
回复

使用道具 举报

发表于 2009-8-3 15:45:19 | 显示全部楼层
流程本身会启动一个事务,你不需要这样子去启动一个事务。

你业务数据处理可以通过流程代理的相关事件上去做,他自然而然的就会在同一个事务中。
回复 支持 反对

使用道具 举报

发表于 2009-8-3 16:21:44 | 显示全部楼层
我是在一个独立的功能上,启动另外一个不相关的流程,无法取到那个流程的代理
回复 支持 反对

使用道具 举报

发表于 2009-8-3 16:26:13 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-3 16:35:51 | 显示全部楼层


为什么对TFlowControl里的事务避而不谈 莫非我用此代码启动流程就不能干预其中的事务?
回复 支持 反对

使用道具 举报

发表于 2009-8-3 16:41:27 | 显示全部楼层
你想知道什么呢?

如果不想流程启动事务,你可以看这个帖子
http://bbs.justep.com/forum.php?mod=viewthread&tid=21996
回复 支持 反对

使用道具 举报

发表于 2009-8-3 16:41:55 | 显示全部楼层
流程事务,不好去做干预。
除了beforeFlowOut 外,其他的流程动作都会启动流程事务,该事务为非立即事务

当在流程动作中(比如AfterFlowOut),那么对于业务数据和流程数据,都会在一个非立即事务中处理,对于要处理的数据有两种状态,一种是data,一种是delta data,对于后者是要提交的数据。当执行了dataset.ApplyUpdates提交数据后,由于事务没有提交,所以对于delta data列表无法清空,所以当再次在该动作中执行dataset.ApplyUpdates提交数据的时候,对于之前已经提交过的数据会被再次提交,所以如果在此流程动作中多次执行dataset.AppalyUpdates后会提示数据被重复提交的一个错误。
对于这种情况,只能把要提交的数据操作单独执行或者只执行一次dataset.ApplyUpdates。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-3 20:05:40 | 显示全部楼层
最初由 zfang 发布
[B]流程事务,不好去做干预。
除了beforeFlowOut 外,其他的流程动作都会启动流程事务,该事务为非立即事务

当在流程动作中(比如AfterFlowOut),那么对于业务数据和流程..

以下省略...... [/B]


还没明白我的意思吗? 我现在有一个业务功能,任何流程外,用户在上面点一个按扭,需要启动一个物资申购流程,并且生成业务数据,如果用上面的代码启动流程不使用事务是可以启动流程的,业务数据也提交,关键这样没有在一个事务中处理很不严谨,想寻求更好的方法
回复 支持 反对

使用道具 举报

发表于 2009-8-3 23:07:53 | 显示全部楼层
我是指
1、上面的代码不要自己加上事务
2、在流程模型中,有相关事件,你把你业务数据的处理写到那里去。
回复 支持 反对

使用道具 举报

发表于 2009-8-4 10:06:00 | 显示全部楼层
补充一句:
FlowBroker1.FlowControl.FlowManager.Transaction
是流程所使用的事务,你只要保证让这个事务和你的业务数据的事务相同就行了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-18 12:44 , Processed in 0.043262 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表