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跨平台或扫描二维码关注

EFCore废弃了TransactionScope取而代之的Context.Database.BeginTransaction相关推荐

  1. 解决EF使用context.Database.SqlQuery时NotMapped属性列为空null的问题(转载)

    有时候我们要为EF中的Model加一个新属性,这个属性不是数据库中的字段,而是从其它表中关联出来的.EF中要标示一个列不是对应表中字段只需要加上NotMapped特性.要使用NotMapped,保证你 ...

  2. Material Recognition in the Wild with the Materials in Context Database论文笔记

    摘要: 在现实世界中,材料识别是一个有挑战性的任务.真实世界中的材料是有很丰富的表面纹理.几何形状.光照条件和杂波.这些因素使的这个问题难以处理.在这边论文,我们提出了一个新的.大规模的.在户外的材料 ...

  3. efcore根据多个条件更新_EF Core 基础知识

    数据库连接字符串 数据库连接字符串 在 ASP.NET Core 添加配置片段: {"ConnectionStrings": {"BloggingDatabase&quo ...

  4. EFCore 5 新特性 Savepoints

    EFCore 5 中的 Savepoints Intro EFCore 5中引入了一个新特性,叫做 Savepoints,主要是事务中使用,个人感觉有点类似于 Windows 上的系统还原点,如果事务 ...

  5. efcore 批量_EFcore使用EFCore.BulkExtensions 批量增加、删除、修改

    EFCore.BulkExtensions 简介 EntityFrameworkCore扩展:批量操作(插入,更新,删除,读取,更新,同步)和批处理(删除,更新). 库是轻量级的,并且非常高效,具有所 ...

  6. .net EF 事务TransactionScope和BeginTransaction的用法

    事务就是确保一次数据库操作,所有步骤都成功,如果哪一步出错了,整个操作都将回滚.在EF使用事务有两种方案,一种是EF自带的.BeginTransaction()方法,另一种是使用Transaction ...

  7. ef core mysql 字符集,EF Core 基础知识

    数据库连接字符串 在 ASP.NET Core 添加配置片段: { "ConnectionStrings": { "BloggingDatabase": &qu ...

  8. ef mysql 事务_事务 - EF Core | Microsoft Docs

    使用事务Using Transactions 9/26/2020 本文内容 事务允许以原子方式处理多个数据库操作.Transactions allow several database operati ...

  9. mysql ef6 事务_使用事务-EF6 | Microsoft Docs

    使用事务Working with Transactions 10/23/2016 本文内容 备注 仅限 EF6 及更高版本 - 此页面中讨论的功能.API 等已引入实体框架 6.EF6 Onwards ...

最新文章

  1. 7 个日常实用的 Shell 拿来就用脚本实例!
  2. 面试官吐槽:面试了一个三本的学渣,开口就要一万六!
  3. php猜数游戏63,PHP实现猜数游戏的代码实例分享
  4. 网易资深Java架构师:java方法的定义和使用
  5. wechat.php+获取昵称,微信后台代码,获取用户昵称
  6. 为什么豌豆荚可以在应用安装完成界面打广告?
  7. hadoopshpython_让python在hadoop上跑起来
  8. 【笔试/面试】—— 序列全排列(递归版)
  9. IE6/7 单选按钮 radio 无法选中解决方法
  10. PAIP.提升安全性---更好的签名HASH算法
  11. relative会脱离文档流吗_抖音投放你会吗?选Feed流还是Dou+?
  12. 我的搜狗拼音皮肤和细胞词库都发布咯!
  13. 内存——CPU、内存以及磁盘是如何交互的
  14. hbase官方文档中文版0.97
  15. gwas snp 和_【交流】关于SNP与GWAS(Genome Wide Association study)的一些想法
  16. 简约至上交互式设计四策略
  17. pthread_cond_init 初始化条件变量使用
  18. 为什么程序员喜欢这些键盘?
  19. 配对交易(一):期货品种相关性研究
  20. ESP32学习笔记(1)——搭建环境、编译烧写(Windows+VS Code)

热门文章

  1. 外部中断0(含知识点)
  2. ng的link和comepile
  3. flex容器属性(一)
  4. 李洪强iOS开发之- 实现简单的弹窗
  5. 个人项目耗时对比记录表
  6. 无法打开物理文件“E:\Database\VRVIES6841-FZ01-Global\VRVEIS.mdf”。操作系统错误 5:“5(拒绝访问。)”...
  7. About the windchill Command -
  8. 如何解决U盘无法停止通用卷设备
  9. 分布式防火墙技术及主要特点
  10. AJAX将成为移动Web2.0时代首选开发平台