EFCore 5 新特性 —— Savepoints
EFCore 5 中的 Savepoints
Intro
EFCore 5中引入了一个新特性,叫做 Savepoints,主要是事务中使用,个人感觉有点类似于 Windows 上的系统还原点,如果事务发生了异常,可以回滚到某一个还原点。
Savepoints
当我们在一个事务里执行 SaveChanges 的时候,EF Core 会在保存数据之前自动的创建一个 savepoint,Savepoints 有点类似于系统还原点的概念,我们可以回滚到指定的 savepoint,
当事务发生错误的时候,会自动回滚到事务创建的 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 transaction
transaction.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
输出结果如下:

可以看到,只有第一个 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
EFCore 5 新特性 —— Savepoints的更多相关文章
- EFCore 5 新特性 `SaveChangesInterceptor`
EFCore 5 新特性 SaveChangesInterceptor Intro 之前 EF Core 5 还没正式发布的时候有发布过一篇关于 SaveChangesEvents 的文章,有需要看可 ...
- efcore 新特性 SaveChanges Events
efcore 新特性 SaveChanges Events Intro 昨天早上看到之前关注的一个 efcore 的 issue 被 closed ,于是看了一眼, ef core 新合并了一个 PR ...
- SQL Server 2014 新特性——内存数据库
SQL Server 2014 新特性——内存数据库 目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 ...
- ElasticSearch 5学习(10)——结构化查询(包括新特性)
之前我们所有的查询都属于命令行查询,但是不利于复杂的查询,而且一般在项目开发中不使用命令行查询方式,只有在调试测试时使用简单命令行查询,但是,如果想要善用搜索,我们必须使用请求体查询(request ...
- [干货来袭]C#6.0新特性
微软昨天发布了新的VS 2015 ..随之而来的还有很多很多东西... .NET新版本 ASP.NET新版本...等等..太多..实在没消化.. 分享一下也是昨天发布的新的C#6.0的部分新特性吧.. ...
- CSS3新特性应用之结构与布局
一.自适应内部元素 利用width的新特性min-content实现 width新特性值介绍: fill-available,自动填充盒子模型中剩余的宽度,包含margin.padding.borde ...
- 【译】Meteor 新手教程:在排行榜上添加新特性
原文:http://danneu.com/posts/6-meteor-tutorial-for-fellow-noobs-adding-features-to-the-leaderboard-dem ...
- 跨平台的 .NET 运行环境 Mono 3.2 新特性
Mono 3.2 发布了,对 Mono 3.0 和 2.10 版本的支持不再继续,而且这两个分支也不再提供 bug 修复更新. Mono 3.2 主要新特性: LLVM 更新到 3.2 版本,带来更多 ...
- Atitit opencv版本新特性attilax总结
Atitit opencv版本新特性attilax总结 1.1. :OpenCV 3.0 发布,史上功能最全,速度最快的版1 1.2. 应用领域2 1.3. OPENCV2.4.3改进 2.4.2就有 ...
随机推荐
- 从面试角度分析LinkedList源码
注:本系列文章中用到的jdk版本均为java8 LinkedList类图如下: LinkedList底层是由双向链表实现的.链表好比火车,每节车厢包含了车厢和连接下一节车厢的连接点.而双向链表的每个节 ...
- Flink统计日活
.keyBy(0) .window(TumblingProcessingTimeWindows.of(Time.days(1), Time.hours(-8))) .trigger(Continuou ...
- 用Python实现童年小游戏贪吃蛇
贪吃蛇作为一款经典小游戏,早在 1976 年就面世了,我最早接触它还是在家长的诺基亚手机中.
- iOS崩溃治理--开篇
去年我开始负责iOS崩溃治理的工作,从原来的万分之五崩溃率,一直到现在的万分之一左右的崩溃率,期间踩了很多坑,因此想和大家分享一下,希望能对大家有所帮助,也欢迎大家私信交流. 如果你打算开始治理崩溃的 ...
- Unity UI适配 之 GridLayoutGroup组件下的内容适配(进度条适配)
好久没有更新博客了,蓝廋啊. 今天写一写关于GripLayoutGroup组件的屏幕适配问题,以在ARPG游戏中常用的经验条适配来举例子,以此来加深自己的记忆,以便在下次需要制作该功能时能够快速完成. ...
- Java学习_异常处理
Java的异常 计算机程序运行的过程中,总是会出现各种各样的错误.有一些错误是用户造成的,比如,希望用户输入一个int类型的年龄,但是用户的输入是abc.程序想要读写某个文件的内容,但是用户已经把它删 ...
- Tensorflow2.0-mnist手写数字识别示例
Tensorflow2.0-mnist手写数字识别示例 读书不觉春已深,一寸光阴一寸金. 简介:通过CNN 卷积神经网络训练后识别出手写图片,测试图片mnist数据集中的0.1.2.4. ...
- 80%的学校还在给新生上C语言,它们OUT了吗?
大家好,最近有小伙伴在后台问我,大一新生学校在教C语言,是不是已经过时了?第一门语言应该学什么比较好?大学期间什么课程对于毕业之后的从业帮助比较大呢? 今天这篇文章就和大家简单聊聊这个问题. 关于我 ...
- Plugin 插件体系
Solon 的插件也可以叫扩展组件,相当于Spring 的 starter.Solon已经提供了大量的基础插件,但对第三方的框架适配目前较少. 插件 说明 boot插件:: 说明 org.noear: ...
- [标签] Java学习日报7.28
package minG;import java.util.*;public class MinG { public static void main(String[] args) { // TODO ...