事务
在WF中,事务也遵从ACID(Atomic,原子性;Consistent,一致性;Isolated,不相关性;Durable,持久性)理论.也就是说,WF Runtime也会用到System.Transactions.Transaction类.Transaction类可以管理使用各种类型持久化存储的事务,例如Miscrosoft SQL Server和其它关系数据库.必要时,Transaction类还可以使用Microsoft Distributed Transaction Coordinator(MSDTC,微软分布式事务协调器)来协调两个相同重量级的事务.
和System.Transactions.TransactionScope类相似,TransactionScope活动会启动一个事务并隐式的记录所有包含在事务里的活动.其TransactionOptions属性用来控制超时和事务的不相关级别.
如果没有错误发生,TransactionScope活动结束后会自动提交事务.如果在活动内部发生了异常,而且该异常并没有被Fault Handler处理,活动就会中断事务并回滚所有工作.
另外,TransactionScope活动中不可以包含TransactionScope活动作为其子活动.
TransactionScope 事物容器
在WF4.0中,主要有两个和事务处理有关的类,TransactionScope和TransactedReceivescope。TransactionScope是用于一般工作流应用程序中的事务处理,TransactedReceivescope则是用于WCF的分布式应用程序中,可用于客户端和服务器的工作流通信。
类名 |
System.Activities.Statements.TransactionScope |
文件 |
System.Activities.dll |
结构说明 |
继承 NativeActivity 是一个 sealed类 override 了 [CacheMetadata方法] 与 [Execute方法] override 了 [CanInduceIdle属性] [AbortInstanceOnTransactionFailure]属性的类型为[bool] [Body]属性的类型为[Activity] [IsolationLevel]属性的类型为[System.Transactions.IsolationLevel] [Timeout]属性的类型为[InArgument<TimeSpan>] [ShouldSerializeIsolationLevel方法]返回值为[bool],无参数 [ShouldSerializeTimeout方法]返回值为[bool],无参数 |
功能说明 |
Body:要在事务中执行的Activity TimeOut:事务的过期时间 AbortInstanceOnTransactionFailure:事务取消时是否取消工作流的执行 IsolationLevel :事务的隔离级别 |
Body:为事务中要执行的活动。
TimeOut:事务的过期时间。
AbortInstanceOnTransactionFailure:事务取消时是否取消工作流的执行。
关于TransactionScope.AbortInstanceOnTransactionFailure
如果[TransactionScope.AbortInstanceOnTransactionFailure]为False,会触发实例的OnUnhandledException
多个[TransactionScope]嵌套的时候,如果[TransactionScope.AbortInstanceOnTransactionFailure]不一致,为False的会触发实例的OnUnhandledException
TransactionScope.AbortInstanceOnTransactionFailure]为true时,不会触发实例的OnUnhandledException,会直接Aborted,会触发实例的Aborted
多个[TransactionScope]嵌套的时候,如果内部[TransactionScope]过期时间小于外部[TransactionScope]过期时间,当这些[TransactionScope.AbortInstanceOnTransactionFailure]都为true时,工作流会取消,会触发实例的Aborted,如果[TransactionScope.AbortInstanceOnTransactionFailure]不一致,为False的会触发实例的OnUnhandledException
IsolationLevel 事务的隔离级别
在事务完成之前,其他用户无法查询,更新,修改事务隔离的数据
对数据所在表的全表读取(Select * from Table)被锁定
可以插入数据新数据.
可以更新没被事务隔离的数据
可以删除没被事务隔离的数据
Unspecified |
正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。 |
Chaos |
无法覆盖隔离级别更高的事务中的挂起的更改。 |
ReadUncommitted |
可以进行脏读,意思是说,不发布共享锁,也不接受独占锁。 |
ReadCommitted |
在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复的读取或幻像数据。 |
RepeatableRead |
在查询中使用的所有数据上放置锁,以防止其他用户更新这些数据。防止不可重复的读取,但是仍可以有幻像行。 |
Serializable |
在 DataSet 上放置范围锁,以防止在事务完成之前由其他用户更新行或向数据集中插入行。 |
Snapshot |
通过在一个应用程序正在修改数据时存储另一个应用程序可以读取的相同数据版本来减少阻止。表示您无法从一个事务中看到在其他事务中进行的更改,即便重新查询也是如此。 |
自定义具有Rollback功能的Activity
protected override void Execute(NativeActivityContext context)
{
// Reference System.Transactions.Dll
RuntimeTransactionHandle runtimeTransactionHandle = new RuntimeTransactionHandle();
runtimeTransactionHandle = context.Properties.Find(runtimeTransactionHandle.ExecutionPropertyName) as RuntimeTransactionHandle;
var transaction = runtimeTransactionHandle.GetCurrentTransaction(context);
var info = transaction.TransactionInformation;
System.Console.WriteLine("LocalIdentifier:{0} ", info.LocalIdentifier);
System.Console.WriteLine("CreationTime:{0} ", info.CreationTime);
System.Console.WriteLine("Status:{0} ", info.Status.ToString());
System.Console.WriteLine("DistributedIdentifier:{0} ", info.DistributedIdentifier);
System.Console.WriteLine("IsolationLevel:{0} ", transaction.IsolationLevel.ToString());
transaction.TransactionCompleted += new System.Transactions.TransactionCompletedEventHandler(transaction_TransactionCompleted);
//回滚当前事务
transaction.Rollback(new System.Exception("wxwinter回滚事务说明"));
事务的过期时间(TimeOut)
默认的时间为1分钟。对于嵌套的子事务范围的过期时间建议默认和父事务范围的一样即可,当子事务容器的过期时间小于父事务容器的过期时间时,会被优先执行,否则被忽略。(以上需要进一步测试)
处理事务的接收范围(TransactedReceiveScope)
在工作流中的活动可以加入一个循环使用的事务。TransactedReceiveScope活动允许你控制循环使用的事务的生命周期。
命名空间:System.ServiceModel.Activities
程序集:System.ServiceModel.Activity.dll