基础才是重中之重~你是否真正了解TransactionScope?

你是否真正了解TransactionScope?

相关文章

将不确定变为确定~transactionscope何时提升为分布式事务

将不确定变为确定~transactionscope何时提升为分布式事务~续      

将不确定变为确定~transactionscope何时提升为分布式事务~再续(避免引起不必要的MSDTC)

一 了解事务选项,用它来控制嵌套事务

    public enum TransactionScopeOption
    {
        //如果存在环境事务(我认为应该叫嵌套事务,氛围事务,ambient transaction),那么就加入其中,
如果不存在就创建新事务。如果加入事务那么只有在环境事务提交后才算提交。
        Required = 0,
        //这个事务范围将创建自己的事务,不会加入到当前外部事务中
        RequiresNew=1,
        // 如果处于当前活动事务范围内,那么这个事务范围既不会加入氛围事务 (ambient transaction),也不会创建自己的事务。
当部分代码需要留在事务外部时,可以使用该选项。
        Suppress = 2,
    }

二 何时会提升为分布式事务(何时发起MSDTC请求)

当你的WEB服务器与数据库服务器在同台电脑上,对同一个库进行操作时,它不会提升为分布式事务

当你的WEB服务器与数据库服务器在同台电脑上对于同一个库,建立多个数据上下文时,它不会提升为分布式事务

当你的WEB服务器与数据库服务器在同台电脑上当你操作两个库的表,这时才会提升为分布式事

当你的WEB服务器与数据库服务器不在同台电脑上,如果建立多于一个Connection连接,将会发起MSDTC

三 反映到linq to sql中,对于一个数据上下文,由于我们操作不当,也会产生多个Connection连接

 

这个方法本身没有问题,做一件事件,而且职责很明确,当完成事情后,通过base.SubmitChange()方法提交到数据库,这时,建立了connection,发送了sql语句,完成了这个通讯。

但有时,这种DAL层的动作需要被BLL层的业务进行组合,BLL层可以在一个事务范围内调用多个类似的DAL方法,这时它们会把这种方法当成是分别独立的工作单元,这是我们不希望看到的,因为在我们理解中,一个BLL业务应该是一个工作单元才对,返回到代码中应该是,多个DAL层的方法被解释为SQL语句后,提交一次就OK,所以,上面的代码在进行组合后,可能会产生一些坏味道!

解决方法:

向BLL层开放数据上下文的SubmitChanges()方法及是否提交的属性IsSubmitChange,在BLL层统一做提交,而对于DAL层的独立的方法,在进行submitChanges()时,需要进行判断IsSubmitChange是否为true,如果是,然后再提交,当然这个IsSubmitChange默认为true,即每次调用单独的方法都会完成这个提交,这是正常的,也符合操作的完整性,

而在BLL进行组合方法时,先将必IsSubmitChange设为false,这时,DAL的方法将不会被提交,等待BLL的Submitchange()。

核心代码:

提交属性IsSubmitChange属性默认为true

 

而对于BLL层,我们公开一个统一的操作对象,它会覆盖掉基类的SubmitChanges方法,它的方法修饰符为public,对BLL层公开。

 BLL层的基类BLLBase,可以通过架造方法为IsSutmitChange属性赋值

 

OK,到这里,我们的BLL无论是调用BLL其它业务组合,还是调用DAL层方法组合,都可以控制代码何时去提交到数据库了,对于一个业务对象,就应该是一个工作单元,呵呵。

本文转自博客园张占岭(仓储大叔)的博客,原文链接:基础才是重中之重~你是否真正了解TransactionScope?,如需转载请自行联系原博主。

时间: 2024-08-02 05:39:25

基础才是重中之重~你是否真正了解TransactionScope?的相关文章

基础才是重中之重系列~目录(永久更新中)

本系列的文章主要是讲C#基础,面向对象OOP及OOD的相关知识,而且本系列文章将一直会更新下去,感谢您的阅读 基础才是重中之重系列~目录 第一回    基础才是重中之重~类是怎么执行的 第二回    基础才是重中之重--面向抽象编程(抽象类的多态性) 第三回    基础才是重中之重--派生类集合与基类集合可以相互转换吗? 第四回    基础才是重中之重~你是否真正理解static对象 第五加    基础才是重中之重--对var的误会,对不起,我愿望你了 第六回    基础才是重中之重~理解内存中

基础才是重中之重~隐藏应该隐藏的对象

(本文不说IOC,不说设计模式,只说基础的internal关键字的实际意义) 题目非常有意思,"隐藏应该隐藏的对象",事实上,我们在做开发时,会遇到一些问题,一个功能会涉及到一些类,一些方法,而向外开放的接口往往只有一个,即一个规范,多个实现,而这些实现,是通过一个类型来区别的,如:一个加密码方法EncryptString,它会有一个类型去标示你是用md5,des,还是其它方式去做加密,而对于实现的细节,调用者不需要关心,当然这还是面向对象的原则问题. 它的类型可能是个枚举: ///

基础才是重中之重~何为原子化操作

占占定义: 原子化操作,操作原子化,这在软件开发中经常被听到,那到底什么是操作原子化呢,其实从字面上不难理解,原子化就是一体化,整体化,原子化操作就是将多个操作组合在一起,要么这个组合一起发生,要么一个都不发生,这就是操作的原子化,在程序开发中,我们经常使用事务来干这事! 网上的解释: 一种不可分割的操作.从外部看,原子操作要么整体发生,要么根本不发生.例如,在实现业务交易的数据管理系统中,把每一笔业务交易都作为数据库上的原子化操作.这就意味着组成业务的所有数据更新操作或者都被执行,或者一个也不

基础才是重中之重~位的运算

位运算无论在C#,VB还是在T-SQL里都有对它支持,位运算即对数值类型的每位进行计算,对于程序里,你可以使用十进制,十六进制,二进制对它进行位运算,事实上无论你使用哪种进制,对于计算机来说最后都为把它转换成二进制(0,1)的形式,因为二进制为简单,呵呵. 下面是关于位运算的表格 运算符号 位运算操作符 运算对象类型 运算结果类型 对象操作数 实例 ~ 非运算 整型 整型 1个 ~x & 与运算 2个 x & y | 或运算 2个 x | y ^ 异或运算 2个 x ^ y <<

基础才是重中之重~如何整理BLL与DAL层的文件

最近在项目重构过程中,发现项目比较乱,项目中的类文件遍及了整个项目文件夹中,为此,我觉得有必要把它们整理一下,我的作法是: 详细划分: BLL层:根据业务或者领域进行划分,如用户业务,财务业务,产品业务,其它业务等等. DAL层:根据表模块进行划分,我们在设计表时会根据功能为表加前缀,如User_XXX,Order_XXX,Product_XXX等等,所以,在DAL层对这些类文件进行最原始的功能划分,它可能有用户模块,公用模块,订单模块,产品模块,后台模块等等. 如果你要划分,需要具备的条件:

基础才是重中之重~开发人员应用学会用throw

无论是.net还是java,在开发程序时都难免会用到throw关键字,对于初学者一般会认为它与try...catch捆绑在一起,这当然是错误的,事实上,throw的一个最重要的作用就是: 让程序告诉用户一些事情,这些事情一般是开发人员之前定义好的,如对于一个输入文本框,你需要输入给定数字,但如果输入的不是给定的数据范围,则可以通过throw告诉用户! 让程序告诉开发人员一些事情,这些事情一般是底层开发人员之前定义好的,如果一些业务规范,如果开发人员输入的不合法,程序就会抛出一个异常,以告诉表层开

基础才是重中之重~用好configSections让配置信息更规范

对于小型项目来说,配置信息可以通过appSettings进行配置,而如果配置信息太多,appSettings显得有些乱,而且在开发人员调用时,也不够友好,节点名称很容易写错,这时,我们有几种解决方案 1 自己开发一个配置信息持久化类,用来管理配置信息,并提供面向对象的支持2 使用.net自带的configSections,将配置信息分块管理,并提供实体类,便于开发人员友好的去使用它 本文主要说说第二种方案,它由实体类,实体类工厂及配置文件三个部分,看代码: 实体类设计: namespace Co

基础才是重中之重~延迟初始化

概念:一个对象的延迟初始化(也称延迟实例化)意味着该对象的创建将会延迟至第一次使用该对象时. 延迟初始化主要用于提高性能,避免浪费计算,并减少程序内存要求. 以下是最常见的方案: 有一个对象的创建开销很大时,应用程序可能不会使用它. 例如,假定您在内存中有一个 Customer 对象,该对象的 Orders 属性返回一个 Orders 对象. 初始化 Orders 对象可能需要创建 Orders 对象的一个大数组(Orders[]),并可能需要数据库连接. 如果用户从不访问 Orders 属性,

基础才是重中之重~网站bin目录下的程序集自动加载

网站bin目录下的程序集一般由系统项目,项目引用的外部DLL及外挂DLL组成,它们在网站运行时会自动加载,这一点很重要,项目本身DLL及项目引入的DLL会自动加载,这没有问题,而外挂在bin目录的DLL也会自动加载,这很重要,因为,它可以使我们的应用程序更加灵活,在开发通用功能上,也显得扩展性更强! 一个例子,比如一个HttpModule,它是一个通用的功能,向页面添加一些缓存过期的共用信息,这对于你所有网站都是共用的,这时,可以建立一个HttpModule项目,它代码可能是这样 namespa