首页 > 代码库 > 【读书笔记】C#高级编程 第二十五章 事务处理

【读书笔记】C#高级编程 第二十五章 事务处理

(一)简介

事务的主要特征是,任务要么全部完成,要么都不完成。

 

 

(二)概述

事务由事务管理器来管理和协调。每个影响事务结果的资源都由一个资源管理器来管理。事务管理器与资源管理器通信,以定义事务的结果。

 

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

【读书笔记】C#高级编程 第二十五章 事务处理