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

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

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

2. 多对象单资源

3. 多对象多资源(分布式事务, 使用两段提交协议)

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

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

ADO.Net2.0 提供的新的事务模型在System.Transactions。System.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 Manager。System.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 接口的实现并显式在事务中登记。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏linux、Python学习

案例+解读,来自有道大神的17个常用Linux命令深度解析

命令后带(Mac)标记的,表示该命令在Mac OSX下测试,其它的在Debian下测试。

1486
来自专栏owent

可执行文件压缩

最近看Rust相关东西的时候看到一篇关于压缩可执行文件的文章。压缩可执行文件对嵌入式开发特别有用,但是延伸一下用来减少我们游戏行业里预编译的工具二进制包大小和A...

4341
来自专栏逆向技术

远程线程注入

一丶远程线程注入的讲解 远程线程注入的原理,我会写一个远程线程开发的例子 我们总共需要几步 /*1.查找窗口,获取窗口句柄*/ /*2.根据...

24910
来自专栏信安之路

一个病毒样本分析的全过程

SHA1: 3f738735bb0c5c95792c21d618eca8c0d5624717

1660
来自专栏塔奇克马敲代码

第 8 章 IO库

1975
来自专栏零基础使用Django2.0.1打造在线教育网站

零基础使用Django2.0.1打造在线教育网站(五):简易留言簿交互实现

努力与运动兼备~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!

4888
来自专栏张善友的专栏

WCF 4.0路由服务Routing Service

在面向服务的应用系统中,最重要的概念就是消息,消息的传输是一个非常重要的问题。而在大多数情况下,消息要经历多个网络节点,这里会涉及到消息路由问题。WS规范很早就...

2088
来自专栏生信技能树

把rstudio的project或者package同步到自己的GitHub

然后rstudio的git/svn需要设置好秘钥连接到自己的GitHub, 参考生信菜鸟团博客教程:http://www.bio-info-trainee.co...

1083
来自专栏YoungGy

R包简单教程

R包概述 R包是什么 为什么学习R包 R包的结构 R包的工作流程 R包的创建 预先准备 包的创建 DESCRIPTION的编写 数据文件 R函数 R文档 测试R...

31910
来自专栏积累沉淀

Oracle递归查询:使用prior实现树操作

oracle树查询的最重要的就是select…start with…connect by…prior语法了。依托于该语法,我们可以将一个表形结构的数据以树的顺...

2965

扫码关注云+社区

领取腾讯云代金券