Fork me on GitHub

.net 2.0 你是如何使用事务处理?

     事务处理作为企业级开发必备的基础设施, .net 2.0通过System.Transactions对事务提供强大的支持.你还是在使用.net 1.x下面的很不好用的事务处理吗?
    

先介绍一下三种事务:
1. 
单对象单资源

untitled1.gif
2. 
多对象单资源

untitled2.gif
3. 
多对象多资源(分布式事务使用两段提交协议)
untitled3.gif
  在
ADO.Net 1.0下有两种使用Transaction的方法一种是在需要事务的对象中显式的调用事务处理还有一种是使用Enterprise Service的声明式的方法.这种方法:使用事务的对象需要继承ServicedComponent;即使不涉及多资源的分布式事务而仅仅是涉及到了多个对象的简单事务(开头介绍的第二种事务),我也要使用此方法,影响了效率这样的弊端和J2ee中的都在本地的Entity Bean之间进行通讯很像,杀鸡也不得不用牛刀.;不可避免的使用了Com+;使用Enterprise Services的事务总是线程安全的也就是说你无法让多个线程参与到同一个事务中.

ADO.Net2.0 提供的新的事务模型综合了前两者的优点:在简单(不涉及分布式)事务中也可以使用声明式的事务处理方法而不必使用Com+容器, ADO.net 2.0中提供了一个轻量级的事务容器. 2 用户根本不需要考虑是简单事务还是分布式事务新模型会自动根据事务中涉及的对象资源判断使用何种事务管理器简而言之对于任何的事务用户只要使用同一种方法进行处理另外对嵌套事务和事务的隔离级别也提供了支持。

ADO.Net2.0 提供的新的事务模型在System.TransactionsSystem.Transactions .NET 2.0 框架中新增的事务控件命名空间。它是一种处理分布式事务的新方式,没有 COM+ 注册和 COM+ 目录的开销。请注意,Microsoft 分布式事务协调器用于初始化事务。从企业服务移动到 System.Transactions 可以简化部署,因为后者不需要使用 COM+ 目录。使用 COM+ 目录时,我们忽略了其他一些额外的功能,只保留了分布式事务支持。System.Transaction 使得在 ASP.NET 2.0 应用程序中编程和部署分布式应用程序变得十分简单。System.Transactions 在运行时的性能提高了 50%,因为它避免了对象实例化的 COM+ 目录查找所产生的开销。最后一个优点是,针对 SQL Server 2005 运行时,System.Transactions 使用的Lightweight Transaction ManagerSystem.Transactions 能够检测到某个分布式事务何时针对宿主在一个 SQL Server 2005 实例上的两个不同数据库运行。在这种情况下,它能够将该分布式事务提升为一个本地事务,这样就可避免与分布式事务登录/两阶段提交相关的全部开销,从而极大地提高性能。

System.Transactions 命名空间同时提供基于Transaction 类的显式编程模型,以及使用 TransactionScope 类的隐式编程模型,在后一种模型中,事务由该基础结构自动管理。强烈建议使用更为方便的隐式模型进行开发.TransactionScope 类通过隐式在分布式事务中登记连接,使代码块事务化。必须在 TransactionScope 块的结尾调用 Complete 方法,然后再离开该代码块。离开代码块将调用 Dispose 方法。如果引发的异常造成代码离开范围,将认为事务已中止。我们建议您采用 using 代码块,以确保在退出 using 代码块时,在 TransactionScope 对象上调用 Dispose。如果无法提交或回滚挂起的事务,可能会对性能造成严重影响,因为 TransactionScope 的默认超时为 1 分钟。如果不使用 using 语句,必须在 Try 代码块中执行所有工作,并在 Finally 代码块中显式调用 Dispose 方法。如果在 TransactionScope 中发生异常,事务将标记为不一致并被弃用。在 TransactionScope 断开后,事务将回滚。如果未发生任何异常,参与的事务将提交。

注意 默认情况下,TransactionScope 类创建一个 IsolationLevel 为 Serializable 的事务。根据应用程序的不同,可能需要考虑降低隔离级别,以避免应用程序中出现大量的争用。建议您只在分布式事务中执行更新、插入和删除,因为这些操作会占用大量的数据库资源。选择语句可能会对数据库资源进行不必要的锁定,在某些方案中,可能需要使用事务进行选择。任何非数据库工作应在事务范围之外完成,除非工作涉及其他事务化的资源管理器。尽管事务范围内的异常会使事务无法提交,但是,TransactionScope 类没有规定回滚您的代码在事务本身范围之外所作的任何更改。如果在事务回滚时需要采取某项措施,必须自己编写 IEnlistmentNotification 接口的实现并显式在事务中登记。

posted @ 2006-05-09 20:22  张善友  阅读(4305)  评论(13编辑  收藏  举报