谈谈分布式事务之三: System.Transactions事务详解[下篇]

在前面一篇给出的Transaction的定义中,信息的读者应该看到了一个叫做DepedentClone的方法。该 方法对用于创建基于现有Transaction对象的“依赖事务(DependentTransaction)”。不像可提交事务 是一个独立的事务对象,依赖事务依附于现有的某个事务(可能是可提交事务,也可能是依赖事务)。 依赖事务可以帮助我们很容易地编写一些事务型操作,当环境事务不存的时候,可以确保操作在一个独 立的事务中执行;当环境事务存在的时候,则自动加入其中。

一、依赖事务(Dependent Transaction)

依赖事务通过DependentTransaction类型表示,DependentTransaction定义如下。和 CommittableTransaction一样,DependentTransaction也是Transaction的子类。既然 DependentTransaction依赖于现有的Transaction对象而存在,相当于被依赖事务的子事务,所以无法执 行对事务的提交,也自然不会定义Commit方法。但是,DependentTransaction具有一个唯一的方法成员 :Complete。调用这个方法意味着向被依赖事务发送通知,表明所有与依赖事务相关的操作已经完成。

1: [Serializable]
2: public sealed class DependentTransaction :  Transaction
3: {
4:     public void Complete();
5: }

1、通过DependentTransaction将异步操所纳入现有事务

通过Transaction的静态属性Current表示的环境事务保存在TLS(Thread Local Storage)中,所以 环境事务是基于当前线程的。这就意味着,即使环境事务存在,通过异步调用的操作也不可能自动加入 到当前事务之中,因为在异步线程中感知不到环境事务的存在。在这种情况下,我们需要做的就是手工 将当前事务传递到另一个线程中,作为它的环境事务。通过依赖事务我们很容易实现这一点。

DependentTransaction通过Transaction的DependentClone方法创建,该方法具有一个 DependentCloneOption枚举类型的参数,体现了被依赖的事务再上尚未接受到依赖事务的通知(调用 Complete或者Rollback方法)得情况下,提交或者完成所采取的事务控制行为。DependentCloneOption 提供了两个选项,BlockCommitUntilComplete表示被依赖事务会一直等待接收到依赖事务的通知或者超 过事务设定的超时时限;而RollbackIfNotComplete则会直接将被依赖的事务回滚,并抛出 TransactionAbortedException异常。

1: [Serializable]
2: public class Transaction : IDisposable,  ISerializable
3: {
4:     //其他成员
5:     public  DependentTransaction DependentClone(DependentCloneOption cloneOption);
6: }
7:  public enum DependentCloneOption
8: {
9:     BlockCommitUntilComplete,
10:      RollbackIfNotComplete
11: }

时间: 2024-12-28 00:31:36

谈谈分布式事务之三: System.Transactions事务详解[下篇]的相关文章

谈谈分布式事务之三 System.Transactions事务详解[上篇]

在.NET 1.x中,我们基本是通过ADO.NET实现对不同数据库访问的事务..NET 2.0为了带来了全新的 事务编程模式,由于所有事务组件或者类型均定义在System.Transactions程序集中的 System.Transactions命名空间下,我们直接称基于此的事务为System.Transactions事务. System.Transactions事务编程模型使我们可以显式(通过System.Transactions.Transaction)或者隐 式(基于System.Tran

Yii2中事务的使用实例代码详解_php实例

前言 一般我们做业务逻辑,都不会仅仅关联一个数据表,所以,会面临事务问题. 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源.通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠.一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性.一致性.隔离性和持久性)属性.事务是数据库运

Yii2中事务的使用实例代码详解

前言 一般我们做业务逻辑,都不会仅仅关联一个数据表,所以,会面临事务问题. 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源.通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠.一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性.一致性.隔离性和持久性)属性.事务是数据库运

WCF服务端运行时架构体系详解[下篇]

作为WCF中一个核心概念,终结点在不同的语境中实际上指代不同的对象.站在服务描述的角度,我们所说的终结点实际上是指ServiceEndpoint对象.如果站在WCF服务端运行时框架来说,终结点实际上指代的是终结点分发器(EndpointDispatcher).而ServiceEndpoint与EndpointDispatcher是一一匹配的,并且前者是创建后者的基础.而终结点分发器具有自己的运行,即分发运行时(DispatchRuntime). 目录 一.终结点分发器(EndpointDispa

WCF客户端运行时架构体系详解[下篇]

当基于某个终结点创建的ChannelFactory<TChannel>被开启的之后,位于服务模型层的客户端运行时框架被成功构建.站在编程的角度看ChannelFactory<TChannel>,它就是一个创建用于服务调用的服务代理对象的工厂.由于服务调用需要借助于服务代理来完成,我们很有必要从整个客户端运行架构层面来了解服务代理和基于服务代理的服务调用是如何实现的. 目录 一.服务代理是一个透明代理 二.服务调用的流程       操作选择       输入参数检验       序

事务使用中如何避免误用分布式事务(System.Transactions.TransactionScope)

1:本地事务DbTransaction和分布式事务TransactionScope的区别: 1.1:System.Data.Common.DbTransaction: 本地事务:这个没什么好说了,就是单个事务,每种数据库都有自己的实现,事务的深度内涵可以搜索查看相关的文章,不是本文介绍的重点. 1.2:System.Transactions.TransactionScope: 分布式事务,需要添加引用System.Transactions,同时启用MSDTC分布式事务服务:通常使用方式为:  u

关于SQL Server 事务、异常和游标详解(1/3)

本教程来说一下关于SQL Server 事务.异常和游标的事情下面来看教程,希望对你有帮助. 1. 事务的特点         事务有若干条T-SQL指令组成,并且所有的指令昨晚一个整体提交给数据库教程系统,执行时,这组指令要么全部执行完成,要么全部取消.因此,事务是一个不可分割的逻辑单元.           事务有4个属性:原子性(Atomicity).一致性(Consistency).隔离性(Isolation)以及持久性(Durability),也称作事务的ACID属性.        

C++实现的分布式游戏服务端引擎KBEngine详解_C 语言

KBEngine 是一款开源的游戏服务端引擎,使用简单的约定协议就能够使客户端与服务端进行交互, 使用KBEngine插件能够快速与(Unity3D, OGRE, Cocos2d, HTML5, 等等)技术结合形成一个完整的客户端. 服务端底层框架使用c++编写,游戏逻辑层使用Python(支持热更新),开发者无需重复的实现一些游戏服务端通用的底层技术, 将精力真正集中到游戏开发层面上来,快速的打造各种网络游戏. (经常被问到承载上限,kbengine底层架构被设计为多进程分布式动态负载均衡方案

System.Transactions; 事务

做个备份:                 using (TransactionScope Tran = new TransactionScope())                 {                     //                    Tran.Complete();                } 注意:              try            {             }             catch (Exception ex