Spiga

Net Framework 2.0 事务处理

2005-11-25 10:36 by geff zhang, 5991 visits, 网摘, 收藏, 编辑

事务

处理事务是构建许多业务逻辑的一个重要方面。

.NET Framework 2.0 中的事务

.NET Framework 2.0包含 System.Transactions,这是一种新的命名空间,完全专注于控制事务性行为。开发人员将最常将 System.Transactions 与某个“执行上下文”配合使用,这是 .NET Framework 2.0 中的一种新结构。执行上下文允许指定适用于包含在一个定义范围内的所有代码的通用信息,如事务。以下是应用程序如何使用该方法将一组操作组合成一个事务的示例:

				
						using System.Transactions;
				
		
				
						using (TransactionScope ts = new TransactionScope(Required))
{
// 执行操作,例如更新不同的 DBMS
ts.Complete();
}

位于 using 块内的所有操作将成为一个事务的一部分,因为它们共享其所定义的事务执行上下文。本例中的最后一行,调用 TransactionScope 的 Complete 方法,将导致退出该块时请求提交该事务。此方法还提供了内置的错误处理,出现异常时会终止事务。

如本例那样,为新 TransactionScope 指定 Required,意味着此代码将总是作为事务的一部分运行:若其调用方的事务存在,则加入之;若不存在,则创建一个新的。如同在企业服务中一样,还可以指定其他选项,包括 RequiresNew、Supported 和 NotSupported。

与企业服务及其前任 MTS 和 COM+ 不同,Systems.Transactions 完全专注于控制事务性行为。例如,事务与对象的内部状态之间不需要存在连接。企业服务要求一个对象在其结束事务时被停用,但 Systems.Transactions 则没有这种需要。

ADO.NET 2.0中的SqlClient提供程序与新的System.Transactions命名空间相集成,从而启用了称为可升级事务的行为。尽管Transact SQL可以用来启动本地或分布式事务(BEGIN TRANSACTION和BEGIN DISTRIBUTED TRANSACTION),但在某些情况下(特别是在客户端/中间层编程方面),程序员可能希望编写可以在一个数据库方案或多个数据库方案中使用的组件。这些方案可能包含多个SQL Server实例,并且SQL Server可以自动检测到多实例访问并将事务从本地“提升”到多实例(分布式)。即使在使用多个数据库产品或多个连接的情况下,这也是可能的,前提是第一个数据库(在分布式事务术语中称为资源管理器)是SQL Server。在ADO.NET中,默认情况下启用可升级的事务。

相关资料:

http://editblog.csdn.net/msdncolumn/archive/2005/02/25/1658.aspx

http://blog.joycode.com/kaneboy/archive/2005/02/15/44356.aspx

http://idior.cnblogs.com/archive/2005/08/15/214300.html


Transaction Team Wiki
Florin Lazar's Blog
Jim Johnson's Blog
Angle Saenz-Badillos' Blog 

作者: 自由、创新、研究、探索……
出处:http://shanyou.cnblogs.com/
版权:本文版权归作者和博客园共有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
个人网站: http://www.openbeta.cn/
0
0
(请您对文章做出评价)
« 上一篇:VS 2005 文本编码小技巧
» 下一篇:MS 的IOC容器(ObjectBuilder)?
Add your comment

15 条回复

  1. #1楼 NoMagic      2005-11-25 12:37
    太好了,又多了一种选择,这样小型项目的数据库事务就不用放在DA层了。
      回复  引用  查看    
  2. #2楼 InterMa 的 Blog      2005-11-25 13:02
    “// 执行操作”
    这里的操作只能是数据库操作把?
    还是任何操作都可以?(感觉不可能)
      回复  引用  查看    
  3. #3楼 阿不      2005-11-25 13:29
    上次在MSDN magazine 上面有看到相关的文章,没完全看懂.好像是所以的资源都可以进行事务处理,包括内存中的临时资源
      回复  引用  查看    
  4. #4楼 QuitGame      2005-11-25 16:13
    好文

    收藏
      回复  引用  查看    
  5. #5楼 木野狐      2005-11-25 18:00
    这个东西在 .net 1.1 下面 Lostinet 就做了一个完美的实现,叫做 SqlScope.
    真不知道微软的这个新的 TransactionScope 有没有吸收他的思想。
      回复  引用  查看    
  6. #6楼 風語者·疾風      2005-11-26 21:21
    我嘗試了一下
    using (TransactionScope ts = new TransactionScope())
    {
    try
    {
    if (!Directory.Exists(@"D:\TransactionDemo"))
    {
    Directory.CreateDirectory(@"D:\TransactionDemo");
    }

    File.Create(@"D:\TransactionDemo\1.Txt");
    throw new Exception();
    File.Create(@"D:\TransactionDemo\2.Txt");
    }
    catch
    {
    return;
    }
    ts.Complete();
    }

    似乎並不支持文件操作的事務,估計這個東西只對數据庫操作的事務處理支持吧。
      回复  引用  查看    
  7. #7楼[楼主] 自由、创新、研究、探索……      2005-11-26 21:35
    是的,应该只是针对数据库事务的
      回复  引用  查看    
  8. #8楼 QuitGame      2005-11-27 00:46
    @ 風語者·疾風

    文件系统本来就不支持事务
      回复  引用  查看    
  9. #9楼 81      2005-11-28 09:15
    应该是封装Com+下的事务组件。
      回复  引用  查看    
  10. #10楼 z[未注册用户]2005-11-28 11:21
    大家都试过么?
    using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
    {
    SqlConnection c = new SqlConnection(ConfigurationManager.ConnectionStrings["constr"].ConnectionString);
    c.Open();
    ...
    }
    到c.Open()时出现异常:“此事务已明地或暗地被确认或终止 ”
      回复  引用    
  11. #11楼 z[未注册用户]2005-11-28 11:21
    大家都试过么?
    using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
    {
    SqlConnection c = new SqlConnection(ConfigurationManager.ConnectionStrings["constr"].ConnectionString);
    c.Open();
    ...
    }
    到c.Open()时出现异常:“此事务已明地或暗地被确认或终止 ”
      回复  引用    
  12. #12楼 kane      2006-01-16 00:47
    还是基于数据库本身的事务支持的,比如ACCESS就不能使用。
      回复  引用  查看    
  13. #13楼 shanyou2006-02-07 17:00
    Sqlserver 2005 TransactionScope能达到我们的需求,但是它在sql server2000上启动的是com+事务,影响性能。
    http://blogs.msdn.com/florinlazar/archive/2005/09/29/475546.aspx
      回复  引用    
  14. #14楼 混沌[未注册用户]2006-04-30 09:56
    可自己实现文件的事务控制。System.Transcations分为事务控制器和资源控制器两部分,通过编写资源控制器(如2PC事务可实现IEnlistmentNotification接口)将自己的事务加到ST中。具体资料可见msdn Help中的"Implementing a Resource Manager"
      回复  引用    
  15. #15楼 skyover[未注册用户]2007-04-02 15:19
    好东西,不过没有试过,现在正在尝试中。
      回复  引用