EFCore废弃了TransactionScope取而代之的Context.Database.BeginTransaction

TransactionScope是.net平台基于的分布式事务组件,它默认为本地事务,同时当系统有需要时可以自动提升为分布式事务,而对系统的前提是要开启MSDTC服务,必要时需要在数据库服务器与应用服务器之间添加hosts的映射,这些在之前已经写过很多文章了,在这里不再说了。


在efcore平台时,你使用TransactionScope将会出现异常,微软会提示你去查看相关资料,这回资料挺准!https://docs.microsoft.com/en-us/ef/core/saving/transactions

本文章主要说了几点内容

  1. 默认的事务-savechanges依旧是一个事务

  2. 单个上下文实现事务

  3. 不同上下文之间实现事务

一 savechanges依旧是一个事务

和之前的ef一样,在进行saveChanges()操作时,本身就是一个事务块,而大叔仓储习惯把每个操作curd都有自己的saveChanges里,而把数据上下文的savechanges对外隐藏,所以如果你要对两个仓储进行insert操作时,你需要添加一个外层的事务来保证数据一致性,这时微软给出了解决方案。

二 单个上下文实现事务

对于一个数据上下文来说,如果你是多个savechanges,那么可以使用context.Database.BeginTransaction()来实现事务。

using (var context = new BloggingContext())

        {

            using (var transaction = context.Database.BeginTransaction())

            {

                try

                {

                    context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });

                    context.SaveChanges();


                    context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/visualstudio" });

                    context.SaveChanges();


                    var blogs = context.Blogs

                        .OrderBy(b => b.Url)

                        .ToList();


                    // Commit transaction if all commands succeed, transaction will auto-rollback

                    // when disposed if either commands fails

                    transaction.Commit();

                }

                catch (Exception)

                {

                    // TODO: Handle failure

                }

            }

        }

三 不同上下文之间实现事务

对于前面的TransactionScope来说,如果是不同的数据上下文来说,我们是无法实现事务操作的,有些同学可以能说它应该被提升为分布式的,但对于EF来说,它是不同实现的,但进行efcore时代之后,这个问题得到了解决!

Cross- only available when a relational database provider because it requires the use of DbTransaction and DbConnection, 
which are specific to relational databases.

上面说明,可以实现一个跨数据上下文的事务,只关系型数据库支持!这个功能大叔认为非常必要,但看它下面给出的实例是针对一个数据上下文的,并不多个上下文的交

叉事务,即并不是两个数据库之间的事务

using (var context1 = new BloggingContext(options))

        {

            using (var transaction = context1.Database.BeginTransaction())

            {

                try

                {

                    context1.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });

                    context1.SaveChanges();


                    using (var context2 = new BloggingContext(options))

                    {

                        context2.Database.UseTransaction(transaction.GetDbTransaction());


                        var blogs = context2.Blogs

                            .OrderBy(b => b.Url)

                            .ToList();

                    }


                    // Commit transaction if all commands succeed, transaction will auto-rollback

                    // when disposed if either commands fails

                    transaction.Commit();

                }

                catch (Exception)

                {

                    // TODO: Handle failure

                }

            }

        }

而如果真正使用多个上下文进行事务的话,同样会出现问题:

var options = new DbContextOptionsBuilder<DemoContext>()

                          .UseMySql("Server=localhost;DataBase=test2;UID=root;Password=root;charset=utf8;port=3306;SslMode=None")

                          .Options;

            using (var context = new DemoContext(options))

            {

                using (var transaction = context.Database.BeginTransaction())

                {

                    var user = new UserInfo

                    {

                        AddTime = DateTime.Now,

                        Email = "test@sina.com",

                        UserName = "test"

                    };

                    context.UserInfo.Add(user);

                    context.SaveChanges();

                    using (var context2 = new TaxContext())

                    {

                        context2.Database.UseTransaction(transaction.GetDbTransaction());

                        context2.UserInfo.Add(new UserInfo { AddTime = DateTime.Now, Email = "tax_test", UserName = "tax" });

                        context2.SaveChanges();

                    }

                    transaction.Commit();

                }

            }

出现下面异常:告诉你,你的数据库连接不是当前的连接

System.InvalidOperationException:“The specified transaction  not associated with the current connection.Only transactions associated with the current connection may be used.”

不知道什么时候EF可以解决多数据库事务的问题,当前你可以使用最终一致性的分布式事务来做这事,不过我们还是一起期待中微软为我们提出更简单的解决方案,一个事务

是否为分布式的,应该看数据库所在服务器是否相同,而不是数据库连接串是否一致!

感谢微软这么完整的解释!

原文地址:http://www.cnblogs.com/lori/p/7659923.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323264.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从 Spring Cloud 看一个微服务框架的「五脏六腑」

转载自 从 Spring Cloud 看一个微服务框架的「五脏六腑」 Spring Cloud 是一个基于 Spring Boot 实现的微服务框架&#xff0c;它包含了实现微服务架构所需的各种组件。 注&#xff1a;Spring Boot 简单理解就是简化 Spring 项目的搭建、配置、组合的框架。因为与构建微服务本…

eclipse导入github项目

首先登录github&#xff0c;找到项目&#xff0c;复制项目地址 复制地址在上面 即可导入成功 然后现在就可以玩游戏了 空手套白狼&#xff0c;github真的是白嫖&#xff0c;程序员必备之品。

From Agile To DevOps - 微软开发部门 DevOps 经验谈

在 2013 年 11 月 13 日&#xff0c;我们正式发行了 Visual Studio 2013&#xff0c;以及全新的 Visual Studio Online 服务。但在服务发表之后&#xff0c;Visual Studio Online 却发⽣了异常&#xff0c;造成七个小时服务中断&#xff0c;这是因为在服务上线时&#xff0c;我…

selenium以及chromdrive安装

selenium的安装比较简单&#xff0c;直接pip install selenium就可以了 看有些网上写的chromedrive安装好麻烦啊&#xff0c;我win10自己试了下&#xff0c;感觉并不需要配置那么多环境变量。 直接性 http://npm.taobao.org/mirrors/chromedriver/ 找到相应的chrome版本即可 至…

通过C#/.NET API使用CNTK

CNTK v2.2.0提供C#API来建立、训练和评估CNTK模型。 本节概要介绍了CNTK C#API。 在CNTK github respository中可以找到C#训练示例。 使用C&#xff03;/ .NET管理API构建深层神经网络 CNTK C#API 通过CNTKLib命名空间提供基本操作。 CNTK操作需要一个或两个具有必要参数的输入…

Kafka Controller Redesign 方案

转载自 Kafka Controller Redesign 方案 Kafka Controller 是 Kafka 的核心组件&#xff0c;在前面的文章中&#xff0c;已经详细讲述过 Controller 部分的内容。在过去的几年根据大家在生产环境中应用的反馈&#xff0c;Controller 也积累了一些比较大的问题&#xff0c;而针…

做个人网站的原因

昨天b站上看视频&#xff0c;浏览评论时&#xff0c;看到一个网址 https://xiaoyou66.com/ 博主写了大概一百篇的文章&#xff0c;我进来的时候真的是被这js特效给惊到了&#xff0c;个人网站也能变得这么二次元嘛&#xff0c;讲实话&#xff0c;光是看这酷炫的页面都比较有欲望…

一文理解Netty模型架构

转载自 一文理解Netty模型架构 本文基于Netty4.1展开介绍相关理论模型&#xff0c;使用场景&#xff0c;基本组件、整体架构&#xff0c;知其然且知其所以然&#xff0c;希望给读者提供学习实践参考。 1 Netty简介 Netty是 一个异步事件驱动的网络应用程序框架&#xff0c;用…

尝试涉猎更多领域

昨天b站上看视频&#xff0c;浏览评论时&#xff0c;看到一个网址 https://xiaoyou66.com/ 博主写了大概一百篇的文章&#xff0c;我进来的时候真的是被这js特效给惊到了&#xff0c;个人网站也能变得这么二次元嘛&#xff0c;讲实话&#xff0c;光是看这酷炫的页面都比较有欲望…

聊聊分布式事务,再说说解决方案

前言 最近很久没有写博客了&#xff0c;一方面是因为公司事情最近比较忙&#xff0c;另外一方面是因为在进行 CAP 的下一阶段的开发工作&#xff0c;不过目前已经告一段落了。 接下来还是开始我们今天的话题&#xff0c;说说分布式事务&#xff0c;或者说是我眼中的分布式事务&…

Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

转载自 RedisTomcatNginx集群实现Session共享&#xff0c;Tomcat Session共享 一、Session共享使用tomcat-cluster-redis-session-manager插件实现 插件地址见&#xff1a; https://github.com/ran-jit/tomcat-cluster-redis-session-manager 该插件支持Tomcat7、Tomcat8、To…

个人博客搭建

先下载node.js 用npm或cnpm安装hexo cnpm install hexo 再创建一个文件夹&#xff0c;在文件夹目录下打开cmd 输入 hexo init 输入 hexo s 这就在本地算是完成了一个博客的创建 新建博客hexo n ‘Hello world’ hexo clean hexo s 就可以再次启动&#xff0c;这样 记得先 cn…

C#使用Xamarin开发可移植移动应用进阶篇(10.综合演练,来一份增删改查CRUD)

说点什么.. 呃 也有半个月没更新了. 本来这篇的Demo早就写完了,文章也构思好了.迟迟没发布..是因为实在太忙.. 项目要上线..各种 你们懂的.. 正赶上自己十一人生大事..结婚..所以..忙的那叫一个脚不沾地啊. 今天的学习内容? 使用我们前面所学的技术,写一个增删改查. 效果如下…

hexo部署在码云出现样式问题

然而本地服务器并没有任何问题 重建一个 重新建一个仓库 还是这种情况&#xff0c;回头再找原因&#xff0c;两次都是这种情况&#xff0c;就是配置错了 借用 https://blog.csdn.net/xiangwanpeng/article/details/53155642 https://blog.csdn.net/qq_29347295/article/deta…

当你输入一个网址的时候,实际会发生什么?

转载自 当你输入一个网址的时候&#xff0c;实际会发生什么? 译文:http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/ 作为一个软件开发者&#xff0c;你一定会对网络应用如何工作有一个完整的层次化的认知&#xff0c;同样这里也包括这些应用所…

SIMD via C#

简介 TL;DR 我们为C#&#xff08;准确地说是.NET Core&#xff09;引入了一套全新的机制&#xff0c;使得C# 以后可以像C/C 一样直接使用intrinsic functions 来直接操作Intel CPU 的大多数SIMD 指令了&#xff08;从SSE 到AVX2&#xff09;。 &#xff08;注意是以后&#xff…

Ae做一个立体地球

Ae做一个立体地球 拿到一张照片 将它变成标题的地球 在AE里 即可变成一个地球 看上去亮多了&#xff0c;再定个关键帧即可旋转

ASP.NET Core 处理 404 Not Found

问题 在没有修改任何配置的情况下&#xff0c;这是用户使用 Chrome 访问不存在的URL时会看到的内容&#xff1a; 幸运的是&#xff0c;处理错误状态代码非常简单&#xff0c;我们将在下面介绍三种技术。 解决方案 在以前的ASP.NET MVC版本中&#xff0c;主要在 web.config 中处…

搭建一个二次元博客

小叙&#xff1a; 因为前段日子尝试过自己搭建网站&#xff0c;也在b站发了视频&#xff0c;奈何技术太菜&#xff0c;被喷的严重。所以决定重构一下网站&#xff0c;改成一个个人博客。这里非常感谢小游提供的主题&#xff0c;感谢他对这么优秀的主题的推广。 如果你正好也要…

从头编写 asp.net core 2.0 web api 基础框架 (5) EF CRUD

Github源码地址&#xff1a;https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-template-from-scratch 这是第一大部分的最后一小部分。要完成CRUD的操作。 Repository Pattern 我们可以直接在Controller访问DbContext&#xff0c;但是可能会有一些问题: …