EF架构~TransactionScope与SaveChanges的关系

回到目录

TransactionScope是.net环境下的事务,可以提升为分布式事务,这些知识早在很久前就已经说过了,今天不再说它,今天主要谈谈Savechanges()这个方法在TransactionScope块里的作用,我们知识TransactionScope只有显示的提交动作而没有回滚,那么它如何实现回滚呢?事实上,.net从来就是一门不啰嗦的语言,它把回滚理解为:"当程序出现问题时,就是回滚的时候"!

提交出现问题的表现?

  1. 就是throw出来的异常
  2. 当前你可以不加try...catch块,也会throw出来
  3. 当你加了try...catch,而又没有throw出来,那你的事务中的回滚就失效了,即数据的一致性没有保正了

所以,如果你要封装自己的savechanges方法,就必须把异常显示的抛出来,像这样的代码是正常的

复制代码
       protected virtual void SaveChanges()
        {
            try
            {
                Db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException)
            {
                throw new DbUpdateConcurrencyException("Lind.DDD框架在更新时引起了乐观并发,后修改的数据不会被保存");
            }
            catch (DbEntityValidationException ex)
            {
                List<string> errorMessages = new List<string>();
                foreach (DbEntityValidationResult validationResult in ex.EntityValidationErrors)
                {
                    string entityName = validationResult.Entry.Entity.GetType().Name;
                    foreach (DbValidationError error in validationResult.ValidationErrors)
                    {
                        errorMessages.Add(entityName + "." + error.PropertyName + ": " + error.ErrorMessage);
                    }
                }
                throw;
            }
            catch (Exception)
            {
                throw;
            }

        }
复制代码

而事实上,我们在UI层或者应用层,可以把异常消化,因为你的页面可能不希望看到500的错误,当然你也可以设置全局的500,404,403等错误页!

像这样代码,把异常消化,对事务是没有影响的,事务能否回滚,只与saveChanges()有关!

复制代码
            try
            {
                InsertData();
            }
            catch (Exception ex)
            {

                Console.WriteLine(ex.Message);
            }
复制代码

感谢各位的阅读!

回到目录

posted @   张占岭  阅读(3897)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
历史上的今天:
2012-05-25 Linq To Sql模式中自动生成T-SQL增删改操作系列~PropertyChanged事件实现在子类中记录属性的变化,在基类中进行统一处理
2011-05-25 说说面向对象的故事,主人是人类!(二)
点击右上角即可分享
微信分享提示