EFCore 5 新特性 Savepoints

EFCore 5 中的 Savepoints

Intro

EFCore 5中引入了一个新特性,叫做 Savepoints,主要是事务中使用,个人感觉有点类似于 Windows 上的系统还原点,如果事务发生了异常,可以回滚到某一个还原点。

Savepoints

当我们在一个事务里执行 SaveChanges 的时候,EF Core 会在保存数据之前自动的创建一个 savepointSavepoints 有点类似于系统还原点的概念,我们可以回滚到指定的 savepoint,

当事务发生错误的时候,会自动回滚到事务创建的 savepoint 回滚到事务开始之前的状态,以便于我们做重试或可能的修复错误或其他逻辑。

我们可以通过 CreateSavepoint 来手动创建一个 savepoint,使用 RollbackToSavepoint 来回滚到某一个 savepoint

来看一个微软的示例代码吧:

using var context = new BloggingContext();
using var transaction = context.Database.BeginTransaction();try
{context.Blogs.Add(new Blog { Url = "https://devblogs.microsoft.com/dotnet/" });context.SaveChanges();transaction.CreateSavepoint("BeforeMoreBlogs");context.Blogs.Add(new Blog { Url = "https://devblogs.microsoft.com/visualstudio/" });context.Blogs.Add(new Blog { Url = "https://devblogs.microsoft.com/aspnet/" });context.SaveChanges();transaction.Commit();
}
catch (Exception)
{// If a failure occurred, we rollback to the savepoint and can continue the transactiontransaction.RollbackToSavepoint("BeforeMoreBlogs");// TODO: Handle failure, possibly retry inserting blogs
}

Sample

我们自己来动手一试,示例代码如下:

var services = new ServiceCollection();
services.AddDbContext<TestDbContext>(options =>
{options.UseSqlite("Data Source=Application.db;Cache=Shared").LogTo(Console.WriteLine, LogLevel.Warning);
});
using var provider = services.BuildServiceProvider();
using var scope = provider.CreateScope();
var dbContext = scope.ServiceProvider.GetRequiredService<TestDbContext>();
dbContext.Database.EnsureCreated();
Console.WriteLine($"Posts count:{dbContext.Posts.Count()}");
using var transaction = dbContext.Database.BeginTransaction();
try
{dbContext.Posts.Add(new Post() { Author = "Tom", Title = "Date changed", PostedAt = DateTime.UtcNow, });dbContext.Posts.Add(new Post() { Author = "Tom", Title = "Date changed", PostedAt = DateTime.UtcNow, });dbContext.SaveChanges();transaction.CreateSavepoint("Stage1");Console.WriteLine($"Posts count:{dbContext.Posts.Count()}");dbContext.Posts.Add(new Post() { Author = "Alice", Title = "Test", PostedAt = DateTime.UtcNow, });dbContext.SaveChanges();transaction.CreateSavepoint("Stage2");Console.WriteLine($"Posts count:{dbContext.Posts.Count()}");throw new InvalidOperationException();transaction.Commit();
}
catch (Exception)
{Console.WriteLine("Exception throw");transaction.RollbackToSavepoint("Stage1");
}Console.WriteLine($"Posts count:{dbContext.Posts.Count()}");

示例代码中创建了两个 savepoint,然后抛出了一个异常,捕获异常后回滚到第一个 savepoint

输出结果如下:

output

可以看到,只有第一个 savepoint 之前的数据保存了下来,第二个 savepoint 虽然数据成功保存了,但是又被回滚了,最终只有第一个 savepoint 之前的数据变更被保存了下来

More

通过 savepoint 我们就可以使得事务控制更加精细,可以更能够好的控制事务中的数据变更

但是需要注意的是,这个功能不要和 Sql Server 中的 Multiple Active Result Sets 一起使用,一旦发生了错误,事务控制可能会发生不可预期的情况。

Savepoints are incompatible with SQL Server's Multiple Active Result Sets, and are not used. If an error occurs during SaveChanges, the transaction may be left in an unknown state.

References

  • https://docs.microsoft.com/en-us/ef/core/saving/transactions#savepoints

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/EF5Samples/SavePointsTest.cs

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

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

相关文章

KBuilderTools小灰熊歌词制作

KBuilderTools小灰熊歌词制作<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />——实战KbuilderTools利用KbuilderTools您可以自己制作卡拉OK字幕描述脚本&#xff0c;这样&#xff0c;您可以利用现成的音乐资源&#xff0c;随心…

安装默认报表服务器虚拟目录,本机模式安装默认配置 (Reporting Services)

“本机模式默认配置”指安装程序既安装报表服务器实例也对其进行配置的 Reporting Services 安装。 安装程序结束后&#xff0c;报表服务器便进入运行状态&#xff0c;可供使用。本机模式报表服务器作为一个独立的应用程序服务器运行。本机模式是默认模式。当选择本机模式默认配…

mongorepository查询条件_MongoRepository实现增删改查和复杂查询【支持的查询类型】...

与HibernateRepository类似&#xff0c;通过继承MongoRepository接口&#xff0c;我们可以非常方便地实现对一个对象的增删改查&#xff0c;要使用Repository的功能&#xff0c;先继承MongoRepository接口&#xff0c;其中T为仓库保存的bean类&#xff0c;TD为该bean的唯一标识…

python numpy数据类型_python numPy模块 与numpy里的数据类型、数据类型对象dtype

学习链接&#xff1a;http://www.runoob.com/numpy/numpy-tutorial.html 简介&#xff1a; numPy是python语言的一个扩展库&#xff0c;是一个运行非常快的数学库&#xff0c;主要用于数组计算。它支持大量的维度与数据运算还针对数组运算提供大量的数学函数库。它包含&#xf…

AWS 宣布创建“真正”开源的 Elasticsearch 分支

喜欢就关注我们吧&#xff01;Elasticsearch 和 Kibana 宣布变更开源许可证后引发了各方激烈讨论&#xff0c;但整起事件的另一个关键角色——被 Elastic 公司 CEO 发文怒斥的 AWS 却一直没有发声。然而就在今日&#xff0c;AWS 宣布将基于目前仍为开源状态的 Elasticsearch 和…

备忘贴,请勿看

今天看了一个黑鹰的动画教程&#xff0c;教程中提到了对白宫***&#xff0c;结果猜解出用户名和密码分别是admin和password。感觉不太对吧&#xff0c;[url]www.whitehouse.org[/url]就这么简单&#xff1f;估计有两种可能&#xff0c;一是教程作者先把网站黑掉了&#xff0c;再…

数控车椭圆编程实例带图_数控车床任意位置椭圆宏程序编程,内附实例程序!...

不在轴线上的椭圆宏程序编制也没有什么特殊的&#xff0c;只是改下偏置的数值罢了。椭圆的参数方程为&#xff1a;Xa*COSθYb*SINθ可改写为&#xff1a; #130*cos[#3] #3为参数方程对应的中角度#220*sin[#3]图中椭圆长半轴30mm&#xff0c;短半轴20mm&#xff0c;椭圆中心位置…

在服务器系统怎么设置地址怎么办,路由器怎么设置地址

路由器怎么设置地址路由器怎么设置地址呢?你是否也很想了解呢?今天我们就一起来看看相关内容吧!路由器怎么设置地址一、自动设置IP地址&#xff0c;使用DHCP服务器功能DHCP是路由器的一个特殊功能&#xff0c;使用DHCP功能可以避免因手工设置IP地址及子网掩码所产生的错误。(…

python迅雷_迅雷下载链接解析器。

1.[代码][Python]代码 Python语言: 迅雷下载链接解析器。 #!/usr/bin/env python #coding:utf-8 import os import base64 import sys def baseurl(argv): if len(argv) 2: url argv[1] else: print "Input Error!\n usage: %s url"%(argv [0]) sys.exit(1) if url…

祝贺 在线文件管理系统 访问量 超过500

到目前为止,<<在线文件管理系统>>一文已有超过500位网友访问过了&#xff0c;深感欣慰。祝贺一下&#xff0c;转载于:https://www.cnblogs.com/GISDEV/archive/2007/10/21/932384.html

dotNet Core 3.1 使用 Elasticsearch

Elasticsearch 是基于 Lucene 的搜索引擎。可以非常方便地实现分布式的全文搜索&#xff0c;本文介绍在 dotNet Core 3.1 中怎样使用 Elasticsearch 。版本dotnet Core &#xff1a;3.1Elasticsearch&#xff1a;7.6.1Kibana&#xff1a;7.6.1NEST&#xff1a;7.10.1Docker&am…

python笔试题 github_简单的python面试题,居然

晚上翻手机&#xff0c;看见一道网友发的python面试题求助帖&#xff0c;当时简单扫一眼就跳过了&#xff0c;但下来仔细想想觉得还蛮有趣&#xff0c;开电脑梳理下思路&#xff0c;因为没有官方答案&#xff0c;所以大家可以一起来做做&#xff0c;其中涉及的python知识点还是…

思科3550 IOS

两种方法升级思科3550 IOS 有两种方法做3550 IOS升级&#xff1a; int vlan 1 ip address 192.168.1.1 255.255.255.0 no shut int f0/1 no shut 默认的接口都VLAN 1下的 一使用.bin文件形式的IOS 1.copy tftp flash: 2.boot system flash:.bin 3.show boot 确定下次启动是用新…

沙洋有几个微服务群_集群 分布式 微服务

转自&#xff1a;https://blog.csdn.net/qq_37788067/article/details/79250623概念:集群是个物理形态&#xff0c;分布式是个工作方式。1.分布式&#xff1a;一个业务分拆多个子业务&#xff0c;部署在不同的服务器上2.集群&#xff1a;同一个业务&#xff0c;部署在多个服务器…

聊聊如何构建一支自驱团队(一)

每一个管理者都致力于构建一支自我驱动的团队&#xff0c;更有甚至&#xff0c;许多人公开宣称&#xff0c;在一支20人以下的团队其实是不用管理手段的&#xff0c;靠团队自驱就能实现团队的快速运作&#xff0c;但知易行难&#xff0c;如果不能根据组织特色灵活的运用管理手段…

java之for循环

/*for循环里i计数器需要用int声明* 本程序是计算*135。。。99。* i2处可以写成i,i 或者ii2如果间隔50 *显然不是一种好的方法*copyright paryjie qq:613972*/public class TextFor {public static void main(String[] args) {long result 0; //用result来存放结果。for(int i1…

action评测 osmo_前后双屏 大疆OSMO ACTION运动相机评测

2019年5月15日晚&#xff0c;大疆正式发布了旗下全新一代运动摄像机&#xff1a;OSMO ACTION。作为OSMO家族的新成员&#xff0c;这款产品的诞生其实一点也不意外&#xff0c;一方面是vlog视频的火爆加速了用户对拍摄设备的使用需求&#xff0c;另外一方面则是运动摄像机这块的…

在.NET Core 中实现健康检查

.NET Core中提供了开箱即用的运行状况检查&#xff0c;首先&#xff0c;我将在.NET Core API应用程序中执行运行状况检查&#xff0c;接下来&#xff0c;我们将使用DbContext集成SQL Server或数据库的运行状况检查&#xff0c;最后是如何实现自定义服务的运行状况检查。在ASP.N…

python3.7安装keras教程_Python3.7安装keras和TensorFlow的教程图解

win10 Python3.7安装keras深度学习集成包 TensorFlow 和Ubuntu下安装keras 在win10下安装 安装时必须检查你的python是否为64位&#xff0c;32位不支持&#xff01;&#xff01;&#xff01; 32 位卸载下载其中的64位在python官网 然后在 pip install --upgrade tensorflow 如果…

(1)学习数组,集合,IEnumerable接口,引申学习迭代器

发展:数组-->集合-->泛型 (1)数组 1. 数组数据结构是System.Array类的一个实例. 2. System.Array类的语法为 [SerializableAttribute] [ComVisibleAttribute(true)] public abstract class Array : ICloneable, IList, ICollection, IEnumerable 3. 下面看一个使用数组…