(一)简介
事务的主要特征是,任务要么全部完成,要么都不完成。
(二)概述
事务由事务管理器来管理和协调。每个影响事务结果的资源都由一个资源管理器来管理。事务管理器与资源管理器通信,以定义事务的结果。
1、事务处理阶段
激活阶段:在这个阶段创建事务。
准备阶段:在这个阶段,每个资源管理器都可以定义事务的结果。
提交阶段:当所有的资源管理器都成功准备好了,就开始这个阶段。
2、ACID属性
事务的特征可以用术语ACID来定义:
Atomicity(原子性):表示一个工作单元。
Consistency(一致性):事务开始前的装态和事务完成后的状态必须有效。
Isolation(隔离性):表示并发进行的事务独立于状态,而状态在事务处理过程中可能发生变化。
Durability(持久性):在事务完成后,它必须以可持久的方式存储起来。
Ps:并不是每个事务都需要这4个属性(例:内存的事务不需要持久性)。
(三)传统的事务
1、ADO.NET事务
public async Task AddCourseAsync(string connectionStr, string sql) { var connection = new SqlConnection(connectionStr); SqlCommand courseCommand = connection.CreateCommand(); courseCommand.CommandText = sql; await connection.OpenAsync(); SqlTransaction tx = connection.BeginTransaction(); try { courseCommand.Transaction = tx; await courseCommand.ExecuteNonQueryAsync(); tx.Commit(); } catch (Exception ex) { Console.WriteLine("Error:" + ex.Message); tx.Rollback(); throw; } finally { connection.Close(); } }
2、System.EnterpriseServices
通过System.EnterpriseServices使用事务的优点是,不需要显式地进行事务处理,运行库会自动创建事务,只需要给有事务处理要求的类添加[Transaction]特性即可。[AutoComplete]特性把方法标记为自动设置事务的状态位:如果该方法成功,就设置成功位,因此可以提交事务。如果发生异常,就终止事务。
[Transaction(TransactionOption.Required)] public class CourseData: ServicedComponent { [AutoComplete] public async Task AddCourseAsync(string connectionStr, string sql) { var connection = new SqlConnection(connectionStr); SqlCommand courseCommand = connection.CreateCommand(); courseCommand.CommandText = sql; connection.Open(); try { courseCommand.ExecuteNonQuery(); } finally { connection.Close(); } } }
用System.EnterpriseServices创建事务的一大优点是,多个对象能轻松地运行在同一个事务中,事务还可以自动登记。缺点是它需要COM+主机模型,使用这个技术的类必须派生自基类ServicedComponent。
事务参考:http://www.cnblogs.com/leslies2/archive/2012/01/05/2289106.html