事务处理是在数据处理时经常遇到的问题,经常用到的方法有以下3种总结整理如下: 方法1:直接写入到sql 中 在存储过程中使用 BEGIN TRANS, COMMIT TRANS, ROLLBACK TRANS 实现 优点:事务逻辑包含在一个单独的调用中,有运行一个事务的最佳性能,立于应用程序。 限制: 事务上下文仅存在于数据库调用中,数据库代码与数据库系统有关。
方法2 :使用ADO.NET 实现
使用ADO.NET 实现,使用这种方式的优点是可以在中间层来管理事务,当然你也可以选择在数据层来实现。 SqlConnection 和OleDbConnection 对象有一个 BeginTransaction 方法,它可以返回 SqlTransaction 或者OleDbTransaction 对象。而且这个对象有 Commit 和 Rollback 方法来管理事务, 本例为更新数据库中某张表的一个示例。 优点: 简单性 和数据据事务差不多的快 独立于数据库,不同数据库的专有代码被隐藏了 缺点: 事务不能跨越多个数据库连接 事务执行在数据库连接层上,所以需要在事务过程中维护一个数据库连接 ADO.NET分布事务也可以跨越多个数据库,但是其中一个SQL SERVER 数据库的话,通过用SQL SERVER连接服务器连接到别的数据库,但是如果是在DB2和Orcal之间就不可以。 以上两种事务是经常用到的事务处理方法。
方法3 COM+事务(分布式事务)
.NET Framework 依靠 MTS/COM+ 服务来支持自动事务。COM+ 使用 Microsoft Distributed Transaction Coordinator (DTC) 作为事务管理器和事务协调器在分布式环境中运行事务。 这样可使 .NET 应用程序运行跨多个资源结合不同操作 定义一个COM+事务处理的类 TransactionScope scope = new TransactionScope(TransactionScopeOption.Required) TransactionOption枚举类型支持5个COM+值(Disabled,NotSupported,Required,RequiresNew,Supported) Disabled 忽略当前上下文中的任何事务。 NotSupported 使用非受控事务在上下文中创建组件。 Required 如果事务存在则共享事务,并且如有必要则创建新事务。 RequiresNew 使用新事务创建组件,而与当前上下文的状态无关。 Supported 如果事务存在,则共享该事务。 一般来说COM+中的组件需要Required 或Supported。当组件用于记录或查帐时RequiresNew 很有用,因为组件应该与活动中其他事务处理的提交或回滚隔离开来。
以下是COM+事务处理的一个示例:
//使用以上COM+事务,必须启动控制面板中管理工具中服务的MS DTC(Distributed Transaction Coordinator) 首先我们要明白什么是分布式事务,如果所有数据的修改仅依靠单个数据源就能完成,则这个事务就相当简单了。然而,随着商业需求的日益增加,应用程序变得越来越复杂,经常需要访问多个数据库,这些数据库通常分布在不同的地方,这就是分布式事务。 而COM+正好满足了我们的需求,我们仍然以上面的示例做说明,如果上面示例的两个测试方法中连接字符串分别连接的是不同的两个数据库,那么当修改其中一个数据库时另一个数据库也将被修改,但是事务中的每个数据源必须装有MS DTC,MSDTC最先集成在SQL Server中,现在已成为COM+必不可少的部分,通过在事务处理中加入其他的因子,MS DTC确认所有的过程完成并提交他们。MS DTC支持使用XA协议的数据库,XA协议是一种两阶段执行的协议,由SQL Server和Oracle支持。单个事务处理可以把数据写到SQL Server和Oracle数据库上。 让我们进一步研究MS DTC,了解其工作方式。为了能用两阶段提交协议进行协调,事务中的每个数据源必须装有MS DTC。在这些安装中,主要的协调器总是在事务的起源之处。这个主要的协调器称为提交协调器,它负责确保事务的提交或终止。不管事务是成功地提交还是回滚,提交协调器都负责向客户应用程序返回一个报告。 分布式事务处理不仅对数据库有用,而且单个事务处理还可以把数据写到数据库和消息队列上,如果这两个操作中的一个失败,另一个操作就会回滚。 消息队列简介: 消息队列技术是分布式应用中交换信息的一种技术。消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走。通过消息队列,应用程序可独立地执行--它们不需要知道彼此的位置、或在继续执行前不需要等待接收程序接收此消息。 在分布式计算环境中,为了集成分布式应用,开发者需要对异构网络环境下的分布式应用提供有效的通信手段。为了管理需要共享的信息,对应用提供公共的信息交换机制是重要的。
COM+的手动事务处理和自动事务处理: 如下图所示为确定使用手动事务处理还是自动事务处理的方法。由于 COM+ 事务处理的系统开销,建议将事务处理放到数据库中并在存储过程中控制事务性行为(如果可能)。 虽然 COM+ 事务处理会带来一些系统开销,但自动事务处理能够提供比手动事务处理更简单的编程模式,而且在事务处理跨多个分布式数据源(与 DTC 一起工作)时必须使用自动事务处理。在数据访问逻辑组件中实现自动事务处理时,请考虑以下建议: • 数据访问逻辑组件必须是从 System.EnterpriseServices 命名空间中的 ServicedComponent 类继承而来。注意,使用 COM+ 服务注册的所有程序集都必须具有严格的名称。 • 使用 Transaction(TransactionOption.Supported) 属性注释数据访问逻辑组件,以便可以在同一组件中执行读写操作。与 Transaction(TransactionOption.Required) 不同,此选项在不需要事务处理时避免了不必要的系统开销,而前者始终会要求事务处理。 以下代码示例显示了如何在数据访问逻辑组件类中支持自动事务处理 using System.EnterpriseServices; [Transaction(TransactionOption.Supported)] public class CustomerDALC : ServicedComponent { //... } 如果使用自动事务处理,则数据访问逻辑组件应在事务处理中表明操作是否成功。如果要隐式表明,应使用 AutoComplete 属性注释您的方法并在操作失败时发出一个异常。如果要显式表明,应对 ContextUtil 类调用 SetComplete 或 SetAbort 方法。 以下是一个具体自动事务的示例:
具体的调用:
如果方法体没有[AutoComplete]属性,按以下方式调用: