在WF4.0中,主要有两个和事务处理有关的类,TransactionScope和TransactedReceivescope。TransactionScope是用于一般工作流应用程序中的事务处理,TransactedReceivescope则是用于WCF的分布式应用程序中,可用于客户端和服务器的工作流通信。
本文主要说明TransactionScope活动的用法,当TransactionScope活动开始就会有一个新的System.Transactions.Transaction 事务,当内部活动都执行完成后会提交事务。
该活动主要有以下属性:
Body:为事务中要执行的活动。
TimeOut:事务的过期时间。
AbortInstanceOnTransactionFailure:事务取消时是否取消工作流的执行。
IsolationLevel 指定事务的隔离级别,有下列值:
成员名称 |
说明 |
Unspecified |
正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。 |
Chaos |
无法覆盖隔离级别更高的事务中的挂起的更改。 |
ReadUncommitted |
可以进行脏读,意思是说,不发布共享锁,也不接受独占锁。 |
ReadCommitted |
在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复的读取或幻像数据。 |
RepeatableRead |
在查询中使用的所有数据上放置锁,以防止其他用户更新这些数据。防止不可重复的读取,但是仍可以有幻像行。 |
Serializable |
防止在事务完成之前由其他用户更新或插入数据。 |
Snapshot |
通过在一个应用程序正在修改数据时存储另一个应用程序可以读取的相同数据版本来减少阻止。表示您无法从一个事务中看到在其他事务中进行的更改,即便重新查询也是如此。 |
多个TransactionScope活动嵌套的时候,如果内部的TransactionScope活动过期时间小于外部的TransactionScope活动过期时间。当这些TransactionScope活动的AbortInstanceOnTransactionFailure属性都为true时,工作流会取消,将激发工作流的Aborted事件。如果该属性设置不一致,为False会激发工作流的OnUnhandledException事件。
可以通过RuntimeTransactionHandle的GetCurrentTransaction方法得到当前事务,如下:
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(e)可以回滚当前事务。
原理和WF3.X的差不多,可以参考http://www.cnblogs.com/carysun/archive/