事务在C#.NET中的使用

来源:互联网 发布:湖南网络公关 编辑:程序博客网 时间:2024/05/16 11:44

事务在c#中的使用

 

1.       事务的概念

事务是一种将操作组合在一起的方式,使操作要么全部完成,要么全部失败。使用事务时,即使一些操作成功,但有一个操作失败,之前执行的操作也将“回滚”,结果就像这些操作没有执行过一样。

一个应该纠正的概念是,事务不仅仅应用于数据库,数据库只是应用事务的一种资源。其他资源包括文件、应用程序状态等。每种资源内部必须有一个资源管理器负责记录变更,并在需要时提交或回滚变更。

 

与数据库相关的事务主要以下两种:

l         SQL事务:在存储工程中使用SQL代码创建和管理事务。

l         .NET事务:在C#代码中创建和使用的事务。

 

关于SQL事务的知识可以参考有关数据库的书籍,这里不再赘述。

下面着重叙述.NET事务的使用。

 

2..NET事务

将所有事务代码存储在数据库中(即SQL事务)的效率较高,但使用.NET代码来管理事务,意味着在同一个事务中可以包含数据库访问代码以及访问其他资源的代码,代码简单,容易调试,并为数据库数据方面提供了更多的灵活性。

 

.NET中处理事务由两种方式。

①获取表示事务的SqlTransaction对象,并通过它执行操作。

命名空间:System.Data.SqlClient

使用方法:

SqlConnection conn = new SqlConnection(ConnectionString);  //数据库连接连接

SqlCommand cmd = new SqlCommand(CommandString,conn);  //命令对象

conn.Open();   //打开连接

SqlTransaction transaction = conn.BegionTransation();  

//此句注意:创建SqlTransaction对象要使用SqlConnection对象的BeginTransaction()//方法,而不能使用new SqlTransaction()的方法

cmd.Transaction = transaction;

 //此方法使作为事务一部分执行的命令显示的放在事务中

try

{

        //Database manipulation code.

        cmd.ExecuteNonQuery();

       

        //Commit transaction. 事务执行成功,提交。

        transaction.Commit();

}

catch

{

        //Roll back transaction.回滚。

        try 

       {

               //Rollback()方法也可能失败,这取决于事务处理过程中发生了什么,

//如失去数据库的连接等。

//因此,应将该方法的调用封装在一个try…catch块中。

               transaction.Rollback();

       }

     catch (SqlException ex)

     {

                     

     }

}

conn.Close();

 

②使用TransactionScopeTransaction对象自动将数据库访问代码包含在事务中。

TransactionScopeTransaction对象提供了一种在任何类型的.NET应用程序中处理事务代码的通用方式。使用这些类与使用SqlTransaction截然不同。首先,需要做的工作更少。其次,它们适用的情形更多,如分布式事务。

命名空间:System.Transactions;

使用方法:

using(TransactionScope transactionScope = new TransactionScope())

{

        try

{

               //Transactional code,including any database access

              

               trsaction.Complete();   //事务提交

        }

        catch(Exception ex)

        {

              

}

}

 

创建TransactionScope实例后,就可以在代码中使用事务(Transaction对象),直到TransactionScope被释放。

TransactionScope类的构造函数包括多个参数,可根据事务隔离级别、超时时间、是否创建新事务等条件进行调用,具体可查看帮助文档。

应用程序完成了它要在某一事务中执行的所有工作后,应该只调用 Complete 方法一次,以便通知事务管理器它可以提交该事务。强烈建议将对 Complete 的调用作为最后一条语句放置在 using 块中。

如果 TransactionScope 对象最初创建了该事务,则通过事务管理器提交该事务的实际工作将在 using 块中的最后一行代码后发生。如果它没有创建该事务,则只要 CommittableTransaction 对象的所有者调用了 Commit,就发生提交。在该时刻,事务管理器将基于对 TransactionScope 对象是否已调用了 Complete 方法,调用资源管理器并通知它们提交或回滚。

 

 

参考文献:c#2005数据库编程经典教程,MSDN

 

 

原创粉丝点击