在 Microsoft .NET Framework 中,System.Transactions 命名空间使得事务的处理比采用以往任何 一种技术都要简单。此前,我曾经撰写过一个数据点专栏,介绍了 System.Transactions 在 Microsoft .NET Framework 2.0 Beta 1 以及 SQL Server 2005 下的工作方式。当然,在 产品的发布过程中,既增加了一些功能,也去掉了一些功能;有些 TransactionScopeOptions 已经发生 了变化。
从那以后,读者们提出了很多有关 System.Transactions 的问题,这也促使我下定决心再探其究竟。 下面,我们就来看看它现在的工作方式,我会告诉您如何使用这个命名空间、它在什么情况下有效以及在 什么情况下不能发挥作用。通过以下的内容,您将了解到如何充分利用 .NET 架构去更有效地使用命名空 间。此外,我还将使用一些事务来演示最佳的实践操作。本文用到的所有示例均可从 MSDN杂志网站 下载。
一语道破天机
我们先来看看如何将两条数据库命令转换为一个事务,具体方法就是 构建一个封装器把这两条命令封装起来。具体操作非常简单。只要引用 System.Transactions.dll,然后 把您需要的事务性代码封装在一个 using 语句内,这个 using 语句会创建一个 TransactionScope,最 后,在事务结束时调用 Complete 方法。
图 1 所显示的就是一个正在创建的事务,这个事务自身 还封装了多个数据库查询。只要任意一个 SqlCommand 对象引发异常,程序流控制就会跳出 TransactionScope 的 using 语句块,随后,TransactionScope 将自行释放并回滚该事务。由于这段代 码使用了 using 语句,所以 SqlConnection 对象和 TransactionScope 对象都将被自动释放。由此可见 ,只需添加很少的几行代码,您就可以构建出一个事务模型,这个模型可以对异常进行处理,执行结束后 会自行清理,此外,它还可以对命令的提交或回滚进行管理。
Figure 1 A Simple Transaction
// Create the TransactionScope using (TransactionScope ts = new TransactionScope()) { using (SqlConnection cn2005 = new SqlConnection(someSql2005)) { SqlCommand cmd = new SqlCommand(sqlUpdate, cn2005); cn2005.Open(); cmd.ExecuteNonQuery(); } using (SqlConnection cn2005 = new SqlConnection(anotherSql2005)) { SqlCommand cmd = new SqlCommand(sqlDelete, cn2005); cn2005.Open(); cmd.ExecuteNonQuery(); } // Tell the transaction scope that the transaction is in // a consistent state and can be committed ts.Complete(); // When the end of the scope is reached, the transaction is // completed, committed, and disposed. }
您在图 1 中所看到的示例还有很多可以灵活设置的部分。TransactionScope 包含了所有的资 源管理器连接,这些连接会自动参与到事务中。这样一来,您就可以为 TransactionScope 设置不同的选 项,在图 1 的示例中,我们使用的是默认设置。
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索事务
, transactions
, 2005
, sqlconnection
, 删除sqldelete
, 事务码
, TransactionScope
一个
system.transactions、dalton transactions、ieee transactions、isa transactions、transactions,以便于您获取更多的相关知识。