在WF4.0中,主要有两个和事务处理有关的类,TransactionScope和TransactedReceivescope。TransactionScope是用于一般工作流应用程序中的事务处理,TransactedReceivescope则是用于WCF的分布式应用程序中,可用于客户端和服务器的工作流通信。这里以TransactionScope 为例。
在自定义活动中,如果要使用事务,可以按照如下代码:
RuntimeTransactionHandle rth = new RuntimeTransactionHandle();
rth = context.Properties.Find(rth.ExecutionPropertyName) as RuntimeTransactionHandle;
Console.WriteLine(" TransactionID: " + rth.GetCurrentTransaction(context).TransactionInformation.LocalIdentifier.ToString());
使用rth.GetCurrentTransaction(context).Rollback()可以回滚当前事务。
启动流程后会发现 rth==null,造成这种情况的原因是整个流程没有事务,所以也就获取不到事务,解决方法:
方法一:将自定义活动放到TransactionScope活动中。
方法二:自己new 一个 TransactionScope 活动,如下:
TransactionScope scope = new TransactionScope();
scope.AbortInstanceOnTransactionFailure = true;
scope.IsolationLevel = System.Transactions.IsolationLevel.Serializable;
scope.Timeout = System.Transactions.TransactionManager.DefaultTimeout;
scope.Body = new Workflow1();
WorkflowApplication application = new WorkflowApplication(scope);
application.run();
这样在整个流程就都在事务活动中了,然后再按照上述代码就可以灵活操纵事务了。
参考文献:
http://www.cnblogs.com/carysun/archive/2009/12/02/WF4-TransactionScope.html