尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

所谓事务,它是一个操作集合,这些操作要么都执行,

所谓事务,它是一个操作集合,这些操作要么都执行,
📅 发布时间:2026/7/3 23:02:17

.从帐户A取出款项。2.把款项放入帐户B中。这两个过程要么同时成功,要么同时失败,这一系列的操作就被称为事务性(Transactional)操作。

在一个事务性操作的环境下,操作有着以下的4种特性,被称为ACID特性

原子性(Atomicity)当事务结束,它对所有资源状态的改变都被视为一个操作,这些操作要不同时成功,要不同时失败
一致性(Consistency)操作完成后,所有数据必须符合业务规则,否则事务必须中止
隔离性(Isolation)事务以相互隔离的方式执行,事务以外的实体无法知道事务过程中的中间状态
持久性(Durable)事务提交后,数据必须以一种持久性方式存储起来

回到目录

二、事务管理器

在软件系统当中可以看到无论在数据库、Web服务、WCF、文件系统都存在着数据参与到事务运作当中,我们把管理这些数据的工具称为资源管理器RM(Resources Manager)。而事务管理器TM(Transaction Manager)就是协调多个资源管理器的工作,保证数据完整性的工具。

由上图可以看到事务的管理流程,系统通知事务管理器TM来启动事务,事务管理器TM控制向多个资源管理器RM并协调RM之间的事务操作。图中存在两个持久化RM,分别管理数据库和文件系统,这些事务操作要不同时成功,要不同时失败。

事务管理器一般分为三类:轻量级事务管理器(LTM)、核心事务管理器(KTM)、分布式事务协调器(DTC)

1. 轻量级事务管理器 (LTM)

它是包括在System.Transactions 命名空间内的一个事务管理框架,它只能管理单个应用程序域内的事务。LTM 可以管理多个易变的RM,但只能管理一个持久化RM。若事务试图加入第二个持久化RM,那轻量级事务管理器LTM将提升级别。LTM是性能最高的事务管理器,在可选择的情况下应该尽可能地使用 LTM 事务管理器。

这里易变RM是指它参与会引发 “未确定状态” 的2PC事务时候,不需要恢复服务,更多时候,易变RM的数据只存储在内存当中。

而持久化RM是指它参与会引发 “未确定状态” 的2PC事务时候,它需要恢复服务,持久化RM管理的数据是在于硬盘当中。所以,参与2PC事务的的持久RM必须有新旧两个版本,如果事务引发 “未确定状态” 的时候,那么它就会联系持久化RM,恢复到其中一个版本。

  • 2PC说明 (http://blogs.msdn.com/b/diegumzone/archive/2006/08/14/699219.aspx)

2PC 是2 Phase Commit的缩写,代表事务的2阶段提交验证算法:在数据提交时,第一阶段:应用程序记录每个数据源并执行更新请求,TM通知每个RM来执行分布式事 务,然后每个RM都对数据执行本地的事务,在事务将提交前,TM会与各个RM进行信息交换,以获知更新是否成功。第二阶段,如果其中任何一个RM表示更新 失败,TM就会通知所有的RM事务操作失败,实现数据回滚。如果所有RM的操作都成功,那么整个TM事务就宣告成功。

2. 核心事务管理器 (KTM)

KTM是用于Windows Vista和Windows Server 2008 系统中的轻量级事务管理器,与LTM相像,它可以管理多个易变的RM,但只能管理一个持久化RM。

3. 分布式事务协调器(DTC)

分布式事务协调器DTC(Distributed Transaction Coordinator)能管理多个持久化RM中的事务,事务可以跨越应用程序域、进程、硬件、域等所有的边界。在Windows Server 2008当中,DTC支持OleDB、XA、WS-AtomicTransaction、WSCoordination、WS-BusinessActivity等多个协议。由于分布式事务需要在多个参与方之间实现多次通讯,所以是一种巨大的开销,因此,在可以使用LTM和KTM的时候,应该尽量避免使用DTC。在上面图片中的事务同时启动了两个RM分别处理数据库数据与文件数据,当中启动的就是DTC分布式事务。

4.事务类 System.Transactioins.Transaction

Transaction是由Framework 2.0 就开始引入,用于显示管理事务的一个类。通过Transaction可以直接管理事务的中止、释放,也可以获取、克隆当前的环境事务类。

  • Transaction的公用属性

其中Transaction.Current 比较常用,它可以指向一个当前运行环境中的事务,如果环境事务不存在,系统将返回一个null

Transaction transaction=Transaction.Current;

属性说明
Current获取或设置环境事务。
IsolationLevel获取事务的隔离级别。
TransactionInformation检索有关某个事务的附加信息。
  • Transaction的常用公用方法

其中Rollback、Dispose方法可以控制事务中止、释放,而Clone、DependentClone方法在多线程操作中经常用到,在 “异步事务” 一节中将详细说明

方法说明
Rollback中止事务、回滚。
Dispose释放事务对象。
Clone创建事务克隆
DependentClone创建事务的依赖克隆。
  • Transaction的事件

在事务完成后,会触发TransactionCompleted事件,开发人员可以在此事件的过程监测其状态

事件说明
TransactionCompleted在事务完成后执行

5. 事务状态 TransactionInformation

上面讲解过事务分为本地事务与分布式事务,而Transaction类的TransactionInformation是事务状态的记录,它可以跟踪事务动作,分辨事务现处的状态,记录本地事务与分布式事务的Guid。

TransactionInformation有两个重要成员

1 public class TransactionInformation 2 { 3 //返回分布式事务标识符 4 public Guid DistributedIdentifier 5 {get;} 6 7 //返回本地事务标识符 8 public string LocalIdentifier 9 {get;} 10 }

LocalIndentifier是本地事务的标识符,它可以获取本地事务管理器(LTM)的ID,并且注意只要事务存在,它的值就永远不会是null。它包含两个部分,一个是LTM的Guid,它是应用程序中的唯一值,代表了现存应用程序域分配的LTM。另一部分是一个可变量,代表了当时该应用程序域中的事务数量。

例如:3427dec9-4abc-34cc-9edf-30ad835c33k3:3

其中3427dec9-4abc-34cc-9edf-30ad835c33k3是此本地事务管理器的Guid,在事务启动后,此值都是不变的,而 “3” 代表此刻该应用程序域中存在 “3” 个本地事务。


DistributedIndentifier是分布式事务的标识符,在普通情况下DistributedIndentifier的值都为Guid.Empty。但当LTM或KTM事务被提升到分布式事务时,DistributedIndentifier就会产生。最重的是,在同一个分布式事务管理器当中,即使事务跨越服务边界,分布式ID都是一致的。DistributedIndentifier是分布式事务的唯一标识符,它的使用方法在后面 “事务的传播” 一节将详细介绍。

在TransactionManager类中,还提供了一个事件DistributedTransactionStarted专门用于测试分布式事务的变化。

1 class Program 2 { 3 static void Main(string[] args) 4 { 5 using (TransactionScope scope = new TransactionScope()) 6 { 7 TransactionManager.DistributedTransactionStarted += OnDistributedTransactionStarted; 8 ............ 9 scope.Complete(); 10 } 11 Console.ReadKey(); 12 } 13 14 //当执行分布式事务是就会启动此方法显示事务信息 15 static void OnDistributedTransactionStarted(object sender, TransactionEventArgs args) 16 { 17 Transaction transaction = args.Transaction; 18 Console.WriteLine("Distributed Transaction Started!\n DistributedIndentifier:" 19 +transaction.TransactionInformation.DistributedIdentifier); 20 } 21 }

基础知识就先讲到这里,下面开始介绍一下事务的具体用法。

回到目录

三、在ADO.NET中实现事务

1. ADO.NET事务的主要成员

需要使用事务管理的情况很多,在数据层使用得特别广泛,几乎每一个系统的数据层都会实现事务。数据层的事务都是继承自DBTransaction,派生自IDbTransaction的。下面介绍一下IDbTransaction的基本成员:

1 public interface IDbTransaction:IDisposable 2 { 3 IDbConnection Connection {get;} //返回Connection对象 4 IsolationLevel IsolationLevel{get;} 5 void Commit(); //数据提交,把所有改变数据保存到持久化数据库 6 void Rollback(); //数据回滚,把所有数据恢复原值 7 }

其中Connection属性是返回初始化此事务时所引用的连接对象的。Commit()方法应该在完成所有数据操作后才调用,调用该方法后,已经改变的数据将会保存到持久化数据库当中。而Rollback()是出现错误时调用的,调用后数据将返回初始值。IsolationLevel是指定遇到其它并行事务时的处理方式。

ADO.NET当中有多个子类都继续自DBTransaction,其中SqlTransaction是比较常用的,SqlTransaction中还定义了一个Save()方法,这个方法允许开发人员把失败的事务回滚到上一个保存点而不回滚整个事务。而在DataContext类里面,Transaction属性会返回DBTransaction对象。

2.开发实例

在传统的ADO.NET中使用事务,方法如下:

1 private static void Execute(string connectionString) 2 { 3 using (SqlConnection connection = new SqlConnection(connectionString)) 4 { 5 connection.Open(); 6 7 SqlCommand command = connection.CreateCommand(); 8 SqlTransaction transaction; 9 10 //启动事务 11 transaction = connection.BeginTransaction("SampleTransaction"); 12 13 //设定SqlCommand的事务和连接对象 14 command.Connection = connection; 15 command.Transaction = transaction; 16 17 try 18 { 19 command.CommandText ="Insert into ......"; 20 command.ExecuteNonQuery(); 21 22 // 完成提交 23 transaction.Commit(); 24 ...... 25 } 26 catch (Exception ex) 27 { 28 //数据回滚 29 transaction.Rollback(); 30 ..... 31 } 32 } 33 }

在DataContext中使用事务,方法极其相似,不同的是SqlCommand中事务为SqlTransaction,在DataContext中事务为DbTransaction

1 using(MyDataContext context=new MyDataContext()) 2 { 3 try 4 { 5 context.Connection.Open(); 6 context.Transaction=context.Connection.BeginTransaction(); 7 //更新数据 8 ......... 9 context.SubmitChanges(); 10 //事务提交 11 context.Transaction.Commit(); 12 } 13 catch(Excetion ex) 14 { 15 //数据回滚 16 context.Transaction.Rollback(); 17 //错误处理 18 ......... 19 } 20 }

回到目录

四、隐式事务 TransactionScope

1. TransactionScope的概念

TransactionScope存在于System.Transactions 命名空间中, 它是从Framework 2.0开始引入的一个事务管理类,它也是微软推荐使用的一个事务管理类。在TransactionScope的构造函数中会自动创建了一个新的LTM(轻量级事务管理器),并通过Transaction.Current 隐式把它设置为环境事务。在使用隐式事务时,事务完成前程序应该调用TransactionScope的Complete()方法,把事务提交,最后利用Dispose()释放事务对象。若执行期间出现错误,事务将自动回滚。

1 public class TransactionScope:IDisposable 2 { 3 //多个构造函数 4 public TransactionScope(); 5 public TransactionScope(Transaction) 6 public TransactionScope(TransactionScopeOption) 7 ...... 8 public void Complete(); //提交事务 9 public void Dispose(); //释放事务对象 10 } 11 12 //调用方式 13 using(TransactionScope scope=new TransactionScope()) 14 { 15 //执行事务型工作 16 ............ 17 scope.Complete(); 18 }

相关新闻

  • OpenBoardView:免费开源的终极PCB电路板查看器完整指南
  • 完全自动驾驶普及时间表:基于接管率与法规落地的理性推演
  • Sysboost核心组件解析:elfmerge、sysboostd与加载器的协同工作原理

最新新闻

  • 电子邮件端到端加密实战指南:从PGP原理到安全通信部署
  • Playwright Java自动化测试:Cookie持久化实现免登录状态管理
  • Steam挂卡神器Idle Master完整指南:轻松获取Steam交易卡片的终极解决方案
  • B站视频下载神器:3分钟搞定离线收藏,告别网络限制的终极指南
  • YOLOv8知识蒸馏实战:用大模型提升小模型精度,实现轻量化目标检测
  • NLP工程实践简报:从XTREME多语言泛化到实时推理落地

日新闻

  • STM32F745VG与MC6470 IMU的高性能姿态控制系统设计
  • 机器不消费,人何以生存
  • AI项目操作手册编写规范与最佳实践

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号