EF中采用的是数据上下文DbContext,当针对数据库的所有操作共用一个数据上下文的时候,会使用同一个连接对象,因此连接打开一次,最后Save的时候关闭连接,避免了频繁的创建连接对象打开关闭,这在一定程度上提升了性能。

对比传统的DbHelper做法,传统的DbHelper通常将线性单元方法进行了封装,每个方法都会创建一个连接对象、打开关闭,因为DbHelper不能采用一个公用的Connection对象,因为如果共用一个连接对象,那么所有的请求操作都会采用这一个连接对象,打开关闭,如果访问量大的时候,瓶颈可想而知。

DAL层都是封装的原子性操作,但是在业务层中,要调用不同的DAL层对象,同时进行多个原子操作。

EF在这一点做到了采用同一个数据上下文,采用同一个连接对象,采用同一个事务,提升了性能。

但是如果你的DbContext是线程级别的,并且事务方法又互相调用就存在了事务嵌套问题,因为嵌套的事务一旦提交就作废了,所以要保证必须是最后提交,如果嵌套事务异常也要在保证外层的回滚

最后采用了事务计数的思想

  public class MyDbContext : DbContext, ITransaction
    {

        public MyDbContext(string connectionString)
            : base(connectionString)
        {
            // 是否启动延迟加载
            Configuration.LazyLoadingEnabled = false;
            // 是否启动代理
            Configuration.ProxyCreationEnabled = false;
            Configuration.AutoDetectChangesEnabled = false;
            Configuration.ValidateOnSaveEnabled = false;

        }

        public void BeginTransaction()
        {
            if (this.Database.CurrentTransaction == null)
            {
                this.Database.BeginTransaction();
            }
            this.BeginCounter++;
            this.IsTransaction = true;

        }

        public int Commit()
        {
            this.BeginCounter--;
            int result = this.SaveChanges();
            )
            {
                this.IsTransaction = false;
                DbContextTransaction transaction = this.Database.CurrentTransaction;
                if (transaction != null)
                {
                    transaction.Commit();
                    transaction.Dispose();
                    result += ;
                }
            }
            return result;
        }

        public void Rollback()
        {
            this.BeginCounter--;
            )
            {
                this.IsTransaction = false;
                DbContextTransaction transaction = this.Database.CurrentTransaction;
                if (transaction != null)
                {
                    transaction.Rollback();
                    transaction.Dispose();
                }
            }
            else
            {
                //this.BeginCounter = 1;
                throw new Exception("嵌套内部事务异常");
            }
        }

        private bool isTransaction = false;

        /// <summary>
        /// 事务性操作
        /// </summary>
        public bool IsTransaction
        {
            get { return isTransaction; }
            set { this.isTransaction = value; }
        }

        ;

        /// <summary>
        /// 事务计数器
        /// </summary>
        public int BeginCounter
        {
            get { return beginCounter; }
            set { this.beginCounter = value; }
        }
    }

EF事务嵌套的更多相关文章

  1. 分享我们项目中基于EF事务机制的架构

    写在前面: 1. 本文中单元测试用到的数据库,在执行测试之前,会被清空,即使用空数据库. 2. 本文中的单元测试都是正确通过的. 要理解EF的事务机制,首先要理解这2个类:TransactionSco ...

  2. Spring Trasnaction管理(3)- 事务嵌套

    问题导读 Spring 如何管理嵌套的事务 Spring事务传播机制 Nested 和 RequireNew 有何区别 事务传播机制 事务的传播机制应该都比较熟悉 在日常开发中会遇到需要事务嵌套的情况 ...

  3. MES项目中出现的一个事务嵌套的使用场景

    昨天在MES项目中,需要在业务逻辑的几个关键点记录错误信息,需要把错误信息写入数据表. 但是由于整个业务逻辑都是包在一个事务模板里面的 比如这样的: WhhTransactionTemplate tr ...

  4. MySql中的事务嵌套

    1.Mysql中的事务必须是InnoDB.Berkeley DB引擎,myisam不支持. 2.Mysql是不支持嵌套事务的,开启了一个事务的情况下,再开启一个事务,会隐式的提交上一个事务. 3.My ...

  5. 分享我们项目中基于EF事务机制的架构 【转载】

    http://www.cnblogs.com/leotsai/p/how-to-use-entity-framework-transaction-scope.html 写在前面: 1. 本文中单元测试 ...

  6. spring配置和注解事务同时存在导致的事务嵌套

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt123 首先先看配置文件: [html] view plaincopy < ...

  7. Spring事务嵌套

    学习一下Spring的事务嵌套:https://blog.csdn.net/zmx729618/article/details/77976793 重点句子: Juergen Hoeller 的话:   ...

  8. EF 事务

    http://yanwushu.byethost7.com/?p=87 1. EF对事务进行了封装:context的saveChange()是有事务性的. 2. 依赖多个不同的Context的操作(即 ...

  9. SQL Server误区30日谈 第26天 SQL Server中存在真正的“事务嵌套”

    误区 #26: SQL Server中存在真正的“事务嵌套”错误 嵌套事务可不会像其语法表现的那样看起来允许事务嵌套.我真不知道为什么有人会这样写代码,我唯一能够想到的就是某个哥们对SQL Serve ...

随机推荐

  1. TextView无法通过setText设值

    因为setText接收的是char序列接口类型实例,假如你在传入int类型的时候一定要String.valueOf: 设值没有成功八成是你传递的为非char序列接口类型!!!!!

  2. 点击input时,里面默认字体消失显示

    点击input时,点击input里面默认字体消失显示: <input type="" name="" id="" value=&quo ...

  3. H264编码原理以及I帧、B和P帧详解

    H264是新一代的编码标准,以高压缩高质量和支持多种网络的流媒体传输著称,在编码方面,我理解的他的理论依据是:参照一段时间内图像的统计结果表明,在相邻几幅图像画面中,一般有差别的像素只有10%以内的点 ...

  4. Ubantu Linux 环境下编译c++程序

    先在文件中新建一个a.cpp文件,在里面编写程序, 然后打开终端输入下面命令即可; $ g++ a.cpp -o b ///编译a.cpp 然后把编译之后的.exe文件存入b中 $ ./b ///执行 ...

  5. Python学习笔记(一)python基础与函数

    1.python基础 1.1输入与输出 输出 用print加上字符串,就可以打印指定的文字或数字 >>> print 'hello, world' hello, world > ...

  6. 分布式缓存Memcached---开篇的话

    大数据.高并发这是最近一段时间内被IT行业提的最为火热的概念,看过<大数据时代>的同学应该不会陌生大数据的概念,尤其是对于互联网行业来说,大数据是每天都要接触的问题,简单通俗地说,每天得大 ...

  7. JAVASE02-Unit010: 多线程基础 、 TCP通信

    多线程基础 . TCP通信 * 当一个方法被synchronized修饰后,那么 * 该方法称为同步方法,即:多个线程不能同时 * 进入到方法内部执行. package day10; /** * 当多 ...

  8. mysql 主从

    1.首先 主库创建二进制数据访问账户(账户:repl 密码:repl@01) GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to repl@'% ...

  9. RabbitMQ学习总结 第七篇:RCP(远程过程调用协议)

    在http://www.cnblogs.com/leocook/p/mq_rabbitmq_2.html 这篇博文中我们实现了怎么去使用work queue来把比较耗时的任务分散给多个worker. ...

  10. Power-BI 预警触发的设定

    在现实的业务场景,当某一区域的销售额低于一定的值时,那么就要引起重视了.我们希望当发生这种情况时,通过邮件或微信通知用户进行关注.Power-BI 预警触发功能就可以实现这个功能.一.设定公共参数1. ...