| 添加到收藏夹 | 返回目录页 | 上一篇:.NET并不一定全是新东西 |
使用.NET Framework 进行事务处理
在使用了ADO.NET 一段时间以后,你会发现新的DataSet与ADO Recordset之间灵活性的区别了。在层与层之间移动表单和它们的关系的能力,以及将它们绑定到可视化对象的能力,并能够使用一套标准的类来处理它们确实是.NET Framework独有的。但是大多数的商务应用程序最终都需要在后端的数据库中插入,更新或者删除数据。当这些操作发生时,你需要有一种方法来保证数据的集成度。这就是事务出现的原因。大多数的开发者明白事务处理和一个事务过程ACID属性的基本概念。从根本上来说,你需要确保数据库的所有修改操作都应该在一个特定的事务过程中完成;否则,它们就会发生问题。下面有两种基本的在.NET中管理数据库事务过程的方法:要么是通过一个ADO.NET Connection对象或者是通过一个COM+对象。
使用ADO.NET Connection 对象
System.Data.SQLClient 和System.Data.OleDBClient 命名空间的Connection对象都支持事务语义。例如,你可以象下面这样管理一个数据库连接的事务上下文:
Dim myConnection As New SqlConnection(myConnString)
myConnection.Open()
Dim myCommand As New SqlCommand()
Dim myTrans As SqlTransaction
@# Create the transaction context
myTrans = myConnection.BeginTransaction()
@# Assign both transaction object and connection
@# to Command object for the transaction
myCommand.Connection = myConnection
myCommand.Transaction = myTrans
在执行了任何数据库修改代码以后,你可以使用myTrans.Commit()提交这个事务过程或者使用myTrans.RollBack()命令回滚这些改变。
使用Connection 对象的Transaction上下文有一个严重的限制,就是它只被限制只能用于单一的数据库(也就是你打开连接的那个数据库)。当然,你不需要从你自己的程序中完成数据库操作过程,你可以使用特定数据库的存储过程,这个过程里包含事务代码。虽然这能够减少你的处理时间,但是你还是会被限制只能在一个数据库中执行事务过程。 控制多个数据库上的事务过程
为了控制多个数据库上的事务过程,你将不得不使用COM+提供的事务机制。
System.EnterpriseServieces对象提供了通过.NET内一个统一的命名空间操作COM+服务的方法。命名空间的一部分包括管理事务的能力。为了创建这种类型的事务,你必须首先创建一个对象,这个对象从System.EnterpriseServices 命名空间继承ServicedComponent 对象的功能。你的这个新的对象然后就能够创建和管理它自己的事务上下文并利用任何拥有事务资源管理器的资源。因此,你不仅可以管理发生在两个SQL Server 数据库之间的事务而且还可以是SQL Server和一个Oracle 数据库之间的事务过程。下面的代码片段演示了两个数据库之间的简单事务过程。
Imports System.Data.SqlClient
Imports System.EnterpriseServices
@#对公共类TrxComponent使用Transaction 属性
Public Class TrxComponent
@#TrxComponent 必须从基类ServicedComponent 继承
Inherits ServicedComponent
@#这里的代码把数据插入到第一个数据库
@#这里的代码把数据插入到第二个数据库
End Function
End Class
TrxComponent 通过继承ServicedComponent 组件的功能来使用COM+ 事务服务。设定了AddData 函数的AutoComplete属性以后,数据库自动的在函数结束的时候进行提交。如果底层的数据库放弃了自己那一部分的事务处理过程的话,整个事务处理过程也会被放弃。你还可以手动的通过除去AutoComplete属性并调用ContextUtil 对象的SetComplete或者SetAbort方法来控制事务的状态。
结论
数据库事务管理是开发者的一个重要工具,它能够维护一个底层数据库的一致性。.NET 对于管理单一数据库的事务过程有它自己的机制,而且在EnterpriseServices 命名空间里还有一套捆绑类能够帮助开发者使用COM+事务服务而不需要亲自动手来做。
↓相关文章:
- · 数据结构与算法(C#实现)系列---树(三)
- · Snake.Net中的ORM(二)
- · Autodesk官方最新的.NET教程(一)(C#版)
- · C#冒泡算法!
- · ReferenceEquals, == , Equals 比较
- · C#2.0新特性探究之模拟泛型和内置算法
- · 如何保持datarow是DataRowState.Added
- · O/R Mapping 研究报告(1)
- · nhibernate架构分析(uml图)
- · C# 特性(Attribute)入门(一)
- · .NET断想
- · 基于C#的接口基础教程之五(6)
- · 基于C#的接口基础教程之五(4)
- · 基于C#的接口基础教程之五(2)
- · 基于C#的接口基础教程之三
- · 到底什么是 O/R Mapper
- · Visual C#托管Socket的实现方法(一) (3)
- · 保护你的代码——谁动了我的组件?
- · 用Visual C#实现文件下载功能(1)
- · 通过.NET Framework访问活动目录(2)
- · 轻松访问系统资源
- · C#锐利体验(8.1)
- · C#锐利体验(6.4)
- · C#锐利体验(6.1)
- · Visual C#中使用线程(3)
- · 从Windows DNA到.NET(3)
- · 从Windows DNA到.NET(1)
- · 微软公布“.NET”第二阶段研发方向
- · C#网络编程初探(3)
- · .NETFramework发现漏洞 可能导致信息丢失
- · 使用.NET Framework 进行事务处理
- · Visual C#.Net网络程序开发-Tcp篇(3)
- · 简化.NET装配库
- · .NET编译技术内幕
- · 浅析C#中的套接字编程(5)
- · 浅析C#中的套接字编程(1)
- · 使用C#轻松编写.Net组件(1)
- · 使用C#开发一个简单的P2P应用
- · Visual Studio.Net 内幕(8)
- · Visual Studio.Net 内幕(6)
- · Visual Studio.Net 内幕(4)
- · Visual Studio.Net 内幕(2)
- · Visual Studio.NET Tips 1-5
- · C#锐利体验(5.2)
- · C#锐利体验(2.2)

