所谓事务,它是一个操作集合,这些操作要么都执行,
.从帐户A取出款项。2.把款项放入帐户B中。这两个过程要么同时成功要么同时失败,这一系列的操作就被称为事务性(Transactional)操作。在一个事务性操作的环境下操作有着以下的4种特性被称为ACID特性原子性Atomicity当事务结束它对所有资源状态的改变都被视为一个操作这些操作要不同时成功要不同时失败一致性Consistency操作完成后所有数据必须符合业务规则否则事务必须中止隔离性Isolation事务以相互隔离的方式执行事务以外的实体无法知道事务过程中的中间状态持久性Durable事务提交后数据必须以一种持久性方式存储起来回到目录二、事务管理器在软件系统当中可以看到无论在数据库、Web服务、WCF、文件系统都存在着数据参与到事务运作当中我们把管理这些数据的工具称为资源管理器RMResources Manager。而事务管理器TMTransaction Manager就是协调多个资源管理器的工作保证数据完整性的工具。由上图可以看到事务的管理流程系统通知事务管理器TM来启动事务事务管理器TM控制向多个资源管理器RM并协调RM之间的事务操作。图中存在两个持久化RM分别管理数据库和文件系统这些事务操作要不同时成功要不同时失败。事务管理器一般分为三类轻量级事务管理器LTM、核心事务管理器KTM、分布式事务协调器DTC1. 轻量级事务管理器 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. 核心事务管理器 KTMKTM是用于Windows Vista和Windows Server 2008 系统中的轻量级事务管理器与LTM相像它可以管理多个易变的RM但只能管理一个持久化RM。3. 分布式事务协调器DTC分布式事务协调器DTCDistributed Transaction Coordinator能管理多个持久化RM中的事务事务可以跨越应用程序域、进程、硬件、域等所有的边界。在Windows Server 2008当中DTC支持OleDB、XA、WS-AtomicTransaction、WSCoordination、WS-BusinessActivity等多个协议。由于分布式事务需要在多个参与方之间实现多次通讯所以是一种巨大的开销因此在可以使用LTM和KTM的时候应该尽量避免使用DTC。在上面图片中的事务同时启动了两个RM分别处理数据库数据与文件数据当中启动的就是DTC分布式事务。4.事务类 System.Transactioins.TransactionTransaction是由Framework 2.0 就开始引入用于显示管理事务的一个类。通过Transaction可以直接管理事务的中止、释放也可以获取、克隆当前的环境事务类。Transaction的公用属性其中Transaction.Current 比较常用它可以指向一个当前运行环境中的事务如果环境事务不存在系统将返回一个nullTransaction transactionTransaction.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 IDbTransactionIDisposable 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中事务为DbTransaction1 using(MyDataContext contextnew MyDataContext()) 2 { 3 try 4 { 5 context.Connection.Open(); 6 context.Transactioncontext.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 }回到目录四、隐式事务 TransactionScope1. 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 scopenew TransactionScope()) 14 { 15 //执行事务型工作 16 ............ 17 scope.Complete(); 18 }

相关新闻

嵌入式电源管理:TPS65263三路降压转换器实战解析

嵌入式电源管理:TPS65263三路降压转换器实战解析

1. 项目背景与核心价值 在嵌入式系统开发中,电源管理一直是个令人头疼的问题。我最近接手的一个工业控制器项目就遇到了典型的多电压域需求:主控MCU需要3.3V核心供电,外围传感器需要5V工作电压,而某些低功耗芯片又要求1.8V电源。传…

2026/7/3 22:42:40阅读更多 →
AI范式迁移:神经符号融合与具身智能的工程落地

AI范式迁移:神经符号融合与具身智能的工程落地

1. 这不是又一次“AI热”,而是底层范式正在位移最近在几个技术闭门会上,我反复听到同一个问题:“我们是不是正站在AI新纪元的门槛上?”——不是问“AI会不会取代谁”,而是问“它正在变成什么”。这个问题背后藏着一个被…

2026/7/3 22:42:40阅读更多 →
终极Steam挂卡指南:Idle Master完整使用教程,轻松获取所有交易卡片

终极Steam挂卡指南:Idle Master完整使用教程,轻松获取所有交易卡片

终极Steam挂卡指南:Idle Master完整使用教程,轻松获取所有交易卡片 【免费下载链接】idle_master Get your Steam Trading Cards the Easy Way 项目地址: https://gitcode.com/gh_mirrors/id/idle_master 还在为繁琐的Steam卡片收集而烦恼吗&…

2026/7/3 22:42:40阅读更多 →
Axure RP中文界面终极解决方案:3分钟告别英文困扰

Axure RP中文界面终极解决方案:3分钟告别英文困扰

Axure RP中文界面终极解决方案:3分钟告别英文困扰 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英…

2026/7/4 0:02:48阅读更多 →
ICM-42688-P与MKV46F256VLH16在工业自动化中的协同应用

ICM-42688-P与MKV46F256VLH16在工业自动化中的协同应用

1. ICM-42688-P与MKV46F256VLH16的黄金组合解析在工业自动化和机器人控制领域,传感器与处理器的协同设计往往决定整个系统的性能上限。ICM-42688-P作为TDK InvenSense推出的6轴运动跟踪IMU(惯性测量单元),其核心价值在于将三轴陀螺…

2026/7/4 0:02:48阅读更多 →
STM32F091RC与LTC6904实现高精度方波信号生成

STM32F091RC与LTC6904实现高精度方波信号生成

1. 项目概述:LTC6904与STM32F091RC的精准方波生成方案在嵌入式系统开发中,精确的时钟信号和定时控制往往是项目成败的关键。LTC6904作为一款低功耗、高精度的可编程振荡器芯片,与STM32F091RC这款ARM Cortex-M0内核微控制器的组合,…

2026/7/4 0:02:48阅读更多 →
缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考牙齿缺失是中老年人群中较为常见的口腔问题,不仅会造成咀嚼不便、进食受影响,长期还可能对营养摄入与日常社交带来困扰。义齿是改善缺牙问题的常用方式,目前市面上的义齿种类较多,…

2026/7/4 0:02:48阅读更多 →
端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

1. 项目概述:当算法工程师走进GTC26展厅,看到的不是芯片,而是“端到端”的呼吸节奏“端到端”这三个字,在GTC’26现场出现的频率,高得像NVLink带宽测试时的峰值曲线——它不再是一个论文里的技术路径选项,而…

2026/7/4 0:02:48阅读更多 →
GitHub Copilot 上线 Kimi K2.7 Code,定价变更下用户开启迁移潮

GitHub Copilot 上线 Kimi K2.7 Code,定价变更下用户开启迁移潮

GitHub Copilot 上线 Kimi K2.7 Code,开启新模型时代7 月 1 日,GitHub 在 Copilot 中正式上线 Kimi K2.7 Code,这是 Copilot 模型选择器里首个开放权重模型。该模型由 GitHub 托管在 Microsoft Azure 上,采用按用量计费的模式&…

2026/7/3 23:57:47阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/3 14:18:39阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/3 14:38:35阅读更多 →
端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

1. 项目概述:当算法工程师走进GTC26展厅,看到的不是芯片,而是“端到端”的呼吸节奏“端到端”这三个字,在GTC’26现场出现的频率,高得像NVLink带宽测试时的峰值曲线——它不再是一个论文里的技术路径选项,而…

2026/7/4 0:02:48阅读更多 →
缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考牙齿缺失是中老年人群中较为常见的口腔问题,不仅会造成咀嚼不便、进食受影响,长期还可能对营养摄入与日常社交带来困扰。义齿是改善缺牙问题的常用方式,目前市面上的义齿种类较多,…

2026/7/4 0:02:48阅读更多 →
STM32F091RC与LTC6904实现高精度方波信号生成

STM32F091RC与LTC6904实现高精度方波信号生成

1. 项目概述:LTC6904与STM32F091RC的精准方波生成方案在嵌入式系统开发中,精确的时钟信号和定时控制往往是项目成败的关键。LTC6904作为一款低功耗、高精度的可编程振荡器芯片,与STM32F091RC这款ARM Cortex-M0内核微控制器的组合,…

2026/7/4 0:02:48阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/3 1:12:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/3 1:36:36阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/3 2:08:15阅读更多 →