EFCore废弃了TransactionScope取而代之的Context.Database.BeginTransaction
TransactionScope是.net平台基于的分布式事务组件,它默认为本地事务,同时当系统有需要时可以自动提升为分布式事务,而对系统的前提是要开启MSDTC服务,必要时需要在数据库服务器与应用服务器之间添加hosts的映射,这些在之前已经写过很多文章了,在这里不再说了。
在efcore平台时,你使用TransactionScope将会出现异常,微软会提示你去查看相关资料,这回资料挺准!https://docs.microsoft.com/en-us/ef/core/saving/transactions
本文章主要说了几点内容
默认的事务-savechanges依旧是一个事务
单个上下文实现事务
不同上下文之间实现事务
一 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相关推荐
- 解决EF使用context.Database.SqlQuery时NotMapped属性列为空null的问题(转载)
有时候我们要为EF中的Model加一个新属性,这个属性不是数据库中的字段,而是从其它表中关联出来的.EF中要标示一个列不是对应表中字段只需要加上NotMapped特性.要使用NotMapped,保证你 ...
- Material Recognition in the Wild with the Materials in Context Database论文笔记
摘要: 在现实世界中,材料识别是一个有挑战性的任务.真实世界中的材料是有很丰富的表面纹理.几何形状.光照条件和杂波.这些因素使的这个问题难以处理.在这边论文,我们提出了一个新的.大规模的.在户外的材料 ...
- efcore根据多个条件更新_EF Core 基础知识
数据库连接字符串 数据库连接字符串 在 ASP.NET Core 添加配置片段: {"ConnectionStrings": {"BloggingDatabase&quo ...
- EFCore 5 新特性 Savepoints
EFCore 5 中的 Savepoints Intro EFCore 5中引入了一个新特性,叫做 Savepoints,主要是事务中使用,个人感觉有点类似于 Windows 上的系统还原点,如果事务 ...
- efcore 批量_EFcore使用EFCore.BulkExtensions 批量增加、删除、修改
EFCore.BulkExtensions 简介 EntityFrameworkCore扩展:批量操作(插入,更新,删除,读取,更新,同步)和批处理(删除,更新). 库是轻量级的,并且非常高效,具有所 ...
- .net EF 事务TransactionScope和BeginTransaction的用法
事务就是确保一次数据库操作,所有步骤都成功,如果哪一步出错了,整个操作都将回滚.在EF使用事务有两种方案,一种是EF自带的.BeginTransaction()方法,另一种是使用Transaction ...
- ef core mysql 字符集,EF Core 基础知识
数据库连接字符串 在 ASP.NET Core 添加配置片段: { "ConnectionStrings": { "BloggingDatabase": &qu ...
- ef mysql 事务_事务 - EF Core | Microsoft Docs
使用事务Using Transactions 9/26/2020 本文内容 事务允许以原子方式处理多个数据库操作.Transactions allow several database operati ...
- mysql ef6 事务_使用事务-EF6 | Microsoft Docs
使用事务Working with Transactions 10/23/2016 本文内容 备注 仅限 EF6 及更高版本 - 此页面中讨论的功能.API 等已引入实体框架 6.EF6 Onwards ...
最新文章
- 7 个日常实用的 Shell 拿来就用脚本实例!
- 面试官吐槽:面试了一个三本的学渣,开口就要一万六!
- php猜数游戏63,PHP实现猜数游戏的代码实例分享
- 网易资深Java架构师:java方法的定义和使用
- wechat.php+获取昵称,微信后台代码,获取用户昵称
- 为什么豌豆荚可以在应用安装完成界面打广告?
- hadoopshpython_让python在hadoop上跑起来
- 【笔试/面试】—— 序列全排列(递归版)
- IE6/7 单选按钮 radio 无法选中解决方法
- PAIP.提升安全性---更好的签名HASH算法
- relative会脱离文档流吗_抖音投放你会吗?选Feed流还是Dou+?
- 我的搜狗拼音皮肤和细胞词库都发布咯!
- 内存——CPU、内存以及磁盘是如何交互的
- hbase官方文档中文版0.97
- gwas snp 和_【交流】关于SNP与GWAS(Genome Wide Association study)的一些想法
- 简约至上交互式设计四策略
- pthread_cond_init 初始化条件变量使用
- 为什么程序员喜欢这些键盘?
- 配对交易(一):期货品种相关性研究
- ESP32学习笔记(1)——搭建环境、编译烧写(Windows+VS Code)
热门文章
- 外部中断0(含知识点)
- ng的link和comepile
- flex容器属性(一)
- 李洪强iOS开发之- 实现简单的弹窗
- 个人项目耗时对比记录表
- 无法打开物理文件“E:\Database\VRVIES6841-FZ01-Global\VRVEIS.mdf”。操作系统错误 5:“5(拒绝访问。)”...
- About the windchill Command -
- 如何解决U盘无法停止通用卷设备
- 分布式防火墙技术及主要特点
- AJAX将成为移动Web2.0时代首选开发平台