首页 > 其他分享 >EF Core事务

EF Core事务

时间:2023-08-08 13:11:47浏览次数:36  
标签:Core 事务 错误 导致 EF 回滚 dbContextTransaction context

EF Core事务
原文链接:https://blog.csdn.net/m0_47659279/article/details/119929767

EF Core 事务

EF Core提供了SaveChange方法,可以把数据操作好之后再统一调用SaveChange方法,这样就实现了简单的事务功能

如果需要多个SaveChange形成一个事务,就是说多个SaveChange要么全部成功,要么全部不执行,则需要使用DbContext.Database.BeginTransaction()来开启一个事务
出现错误时调用IDbContextTransaction.Rollback()方法实现回滚

例如

// 开启事务
using (IDbContextTransaction dbContextTransaction = context.Database.BeginTransaction())
{
  try
  {
    context.Cities.Add(new City() { CityName = "Test", CityUrlCode = "123", Province = 2 });
    context.SaveChanges();
    context.Cities.Add(new City() { CityName = "Test2", CityUrlCode = "这是一个会导致错误的值这是一个会导致错误的值这是一个会导致错误的值这是一个会导致错误的值这是一个会导致错误的值这是一个会导致错误的值", Province = 2 });
    context.SaveChanges();
    //提交事务
    dbContextTransaction.Commit();
  }
  catch
  {
  	//回滚
    dbContextTransaction.Rollback();
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

运行后发现数据库中一条记录也没有添加,说明回滚成功了

保存点

在事务中创建保存点,这样在失败时可以回滚到该保存点
例如

using (IDbContextTransaction dbContextTransaction = context.Database.BeginTransaction())
{
  try
  {
    context.Cities.Add(new City() { CityName = "Test", CityUrlCode = "123", Province = 2 });
    context.SaveChanges();
    //创建保存点,并在失败时回滚到该保存点:
    dbContextTransaction.CreateSavepoint("savePoint1");
    context.Cities.Add(new City() { CityName = "Test2", CityUrlCode = "这是一个会导致错误的值这是一个会导致错误的值这是一个会导致错误的值这是一个会导致错误的值这是一个会导致错误的值这是一个会导致错误的值", Province = 2 });
    context.SaveChanges();
    dbContextTransaction.Commit();
  }
  catch
  {
    //回滚到保存点
    dbContextTransaction.RollbackToSavepoint("savePoint1");
    dbContextTransaction.Commit();
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

运行后发现数据库中多了一条记录,说明回滚到保存点成功了

标签:Core,事务,错误,导致,EF,回滚,dbContextTransaction,context
From: https://www.cnblogs.com/sunny3158/p/17613901.html

相关文章

  • @Transactional(rollbackFor = Exception.class) 详解 推荐的事务注解方式 @Transact
    @Transactional(rollbackFor=Exception.class)详解原文链接:https://blog.csdn.net/weixin_43987718/article/details/12342262117、@Transactional(rollbackFor=Exception.class)详解1、参考来源:https://www.cnblogs.com/clwydjgs/p/9317849.html1)、异常是分为运行......
  • Codeforces 1857D:Strong Vertices 与图论无关的出度最大统计
    1857D.StrongVerticesDescription:给定两个长度均为\(n\)的数组\(a\)和\(b\)(编号\(1\)~\(n\)),如果\(a_u-a_v\geqb_u-b_v\)\((u\neqv)\),那么从\(u\)到\(v\)建立一条有向边。"Strong"定义为:一个点\(V\)可以经过有向图中合法的通路到达其他所有的点。请求解出"......
  • Codeforces Round 891 (Div. 3)
    A.ArrayColoring题意给你\(n(2\len\le50)\)个数,你可以把每个数染成红或蓝,求是否有方案满足每个颜色都有数而且两种颜色每个颜色内所有数之和的奇偶性相同。多组数据\((t\le1000)\)。例如:\([1,2,4,3,2,3,5,4]\)染成\([\color{blue}1,\color{blue}2,\color{red}4,\color{......
  • 人人贷(中js逆向学会模块改写(define/require/exports/module)
    链接https://renrendai.com/login?returnUrl=%2F这里逆向登入中的password加密 我们需要定位到password加密到位置,通过下面的搜索j_password,或者通过栈调用方式查找 可以看到加密的是这种模式define("common:node_modules/glpb-components-common/src/rsa/rsaCrypt",f......
  • 【HMS Core】Health Kit 血压、血糖等数据返回数据包含max,min,avg,last 数据,这些数据
    ​【问题描述】1. 血压、血糖等数据返回数据包含max,min,avg,last数据,这些数据的含义是什么意思?​2. 如何获取用户上传健康数据的腕表的型号 【解决方案】1、血压原子采样统计数据类型开放的是多日统计查询接口,统计的维度是按照自然日进行统计的。​最大最小以及平均......
  • 【HMS Core】Health Kit 血压、血糖等数据返回数据包含max,min,avg,last 数据,这些数据
    【问题描述】1. 血压、血糖等数据返回数据包含max,min,avg,last数据,这些数据的含义是什么意思?2. 如何获取用户上传健康数据的腕表的型号【解决方案】1、血压原子采样统计数据类型开放的是多日统计查询接口,统计的维度是按照自然日进行统计的。最大最小以及平均值是指这一天的最大......
  • event 10513将禁止smon进程进行事务回滚
    Oracle参数之event10513发布时间:[2012-4-10]    来源:    作者:    点击:我们设置Oracle参数event10513将禁止smon进程进行事务回滚。在进行troubleshooting时,如shutdownabort后设置该速度可以加快数据库的open速度,注意加快速度的同时,也可能带来数据库一致性问......
  • 解决ls: relocation error: /lib64/libacl.so.1: symbol getxattr, version ATTR_1.0
    这个问题是在我conda装了一个包之后就出现了,ls等最基础的命令没有办法用了,网上的帖子也没有很好解决我的问题,而且我试了把我刚刚安的包删掉也没有解决,后面仔细分析一下这个报错,猜测应该是包安装的过程中本地conda中的一些依赖与系统中的一些起了冲突。通过ldd/lib64/libacl.so......
  • .net core 单文件发布,找不到appsettings.json的问题
    解决方案config.SetBasePath(GetBasePath());config.AddJsonFile("appsettings.json",false);privatestringGetBasePath(){usingvarprocessModule=Process.GetCurrentProcess().MainModule;returnPath.GetDirectoryName(processModule?.FileName......
  • vue3 'alex' is defined but never used
    解决方法在package.json中的rules下加入"no-unused-vars":"off"即可......