前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >EntityFrameworkCore 当中使用了 using 创建事务是否需要显式 Rollback

EntityFrameworkCore 当中使用了 using 创建事务是否需要显式 Rollback

作者头像
SpiritLing
发布于 2022-09-22 08:57:22
发布于 2022-09-22 08:57:22
49100
代码可运行
举报
文章被收录于专栏:SpiritLingSpiritLing
运行总次数:0
代码可运行

例子

参考官方例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
}

解析源码

直接定位 transaction 时会定位到EFCore中,这个里面我并没有找到对应的显式Rollback操作,但是经过网络上查询,找到了一个源码中实现了自动 Rollback

System.Data.SqlClient 中的 SqlInternalTransaction 中反编译后,会发现下面的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    // .method private hidebysig instance void
      // Dispose(
        // bool disposing
      // ) cil managed
    private void Dispose(bool disposing)
    // .maxstack 8
    // 
    // IL_0000: ldarg.1      // disposing
    // IL_0001: brfalse.s    IL_0018
    // IL_0003: ldarg.0      // this
    // IL_0004: ldfld        class System.Data.SqlClient.SqlInternalConnection System.Data.SqlClient.SqlInternalTransaction::_innerConnection
    // IL_0009: brfalse.s    IL_0018
    // IL_000b: ldarg.0      // this
    // IL_000c: ldc.i4.1
    // IL_000d: stfld        bool System.Data.SqlClient.SqlInternalTransaction::_disposing
    // IL_0012: ldarg.0      // this
    // IL_0013: call         instance void System.Data.SqlClient.SqlInternalTransaction::Rollback()
    // IL_0018: ret
    // 
    {
      if (!disposing || this._innerConnection == null)
        return;
      this._disposing = true;
      this.Rollback();
    }

上面代码中,明显的看出当 _innerConnection 不为 null 时,会在释放后调用 Rollback 来进行回滚

参考

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
黑马公开课——运行原理与GC学习笔记
.NET Framework的组成: (1)基础类库(BCL):使用线程的类来完成编程,对于不存在的类,就自己编写; (2)编译工具:将源文件,编译成“程序集”(exe或dll等)[.NET环境中,MSIL=CIL=IL] (3)公共语言运行时(CLR):执行前检测、编译;执行到了某个方法时才编译这个方法的代码[即时编译器(JIT)] 编译过程:.NET源代码(C#)——>通过C#编译器编译成程序集[程序集中包括:元数据(一个表,显示了程序中有什么成员,类,字段,方法等),IL代码等资源] 运行例子: (1)源代码如下: using System;
Edison Zhou
2018/08/20
4540
黑马公开课——运行原理与GC学习笔记
《Java编程思想》笔记05——多态
在drawBlue()接受一个Art类的引用,同时,它也可以接受一个Art的子类引用。因此,当传入Draw类的引用时,该方法也可以执行。因为,Draw类是从Art类继承而来的,Art类的接口必然存在于Draw中,从Draw类向上转型会缩小接口,但接口不会比Art类更窄。
全栈程序员站长
2022/07/20
2500
GeneralUpdate解决设计中异常传递问题
大家好我是juster,GeneralUpdate(一款应用程序自动升级组件)作者。在设计组件的时候也会遇到不少问题,经常会在半夜想到一个解决办法爬起来将这个办法或者是设计记录下来或者直接实现。这里将很久之前设计思路写出来向大家讨教、分享,在设计和实现的过程遇到的问题以及是如何解决的。
JusterZhu
2023/08/10
1480
GeneralUpdate解决设计中异常传递问题
(八)c#Winform自定义控件-分割线
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/11
7430
(八)c#Winform自定义控件-分割线
TypeScript 引入新的关键字 “using” !
最近发布的 TypeScript 5.2 版本中带来了一个全新的关键字 using ,同时它也是一项进入 Stage 3 阶段的 TC39 提案。官方对它的定义为 Explicit Resource Management ,即显式资源管理,它具体解决了什么问题,又怎么使用呢,我们一起来看一下。
ConardLi
2023/08/23
2860
TypeScript 引入新的关键字 “using” !
C#规范整理·资源管理和序列化
资源管理(尤其是内存回收)曾经是程序员的噩梦,不过在.NET平台上这个噩梦似乎已经不复存在。CLR在后台为垃圾回收做了很多事情,使得我们现在谈起在.NET上进行开发时,都会说还是new一个对象吧!回收?有垃圾回收器呢。其实并没有这么简单。
郑子铭
2023/08/30
2820
C#规范整理·资源管理和序列化
CA1063:正确实现 IDisposable
对于未密封的类型,Finalize 实现不调用或不同时调用 Dispose(bool) 或基类终结器。
呆呆
2022/01/10
6020
控件属性和InitializeComponent()关系:
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说控件属性和InitializeComponent()关系:,希望能够帮助大家进步!!!
Java架构师必看
2022/03/21
4411
控件属性和InitializeComponent()关系:
(三十七)c#Winform自定义控件-有标题的面板
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/11
6890
(三十七)c#Winform自定义控件-有标题的面板
改善C#程序的建议4:C#中标准Dispose模式的实现
需要明确一下C#程序(或者说.NET)中的资源。简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类:
潘成涛
2019/05/25
6930
解析“60k”大佬的19道C#面试题(下)
这些题目确实不怎么经常使用,因此在后文中,我会提一组我的私房经典“ 6k面试题”,供大家轻松一刻使用。
李明成
2020/04/15
1.7K0
C# 的构造函数和析构函数
在C#编程中,构造函数和析构函数是控制对象生命周期的关键工具。构造函数用于初始化新创建的对象,而析构函数则在对象的生命周期结束时执行清理工作。正确地使用这两个特殊的方法可以提高代码的效率和可靠性。本文将深入探讨C#中的构造函数和析构函数,包括它们的基本概念、实现方式、高级用法和最佳实践。
Michel_Rolle
2024/10/08
2.5K0
熟悉而陌生的新朋友——IAsyncDisposable
在.NET Core 3.0的版本更新中,官方我们带来了一个新的接口 IAsyncDisposable。
句幽
2021/09/08
7610
CA2015:请勿为派生自 MemoryManager<> 的类型定义终结器
如果发生将终结器添加到派生自 MemoryManager<T> 的类型的情况,可能表示存在 bug,因为这表明在 Span<T> 中分发的本机资源正在被清除,同时 Span<T> 可能仍在使用该资源。
用户4268038
2022/02/20
2530
(七)c#Winform自定义控件-进度条
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/11
6770
(七)c#Winform自定义控件-进度条
编程小知识之 Dispose 模式
之前对 C# 中的 Dispose 模式只有些模糊印象,近来又了解了一些相关知识,在此简单做些记录~
用户2615200
2019/02/22
1.1K0
C#-TextBox-登录窗口密码不可见—ShinePans[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/161502.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/09
1.4K0
C#-TextBox-登录窗口密码不可见—ShinePans[通俗易懂]
Using sqlite with .NET
The other day I found that there is a .NET wrapper for sqlite. sqlite is a very cool embeddable SQL-92 database engine. It's a single library that gives you a very fast, very scalable (2TB), single file, multi-user database. I thought the .NET wrapper is e
张善友
2018/01/31
6520
(二十二)c#Winform自定义控件-半透明窗体
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/11
1.6K0
(三)c#Winform自定义控件-有图标的按钮
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/11
1.4K0
(三)c#Winform自定义控件-有图标的按钮
相关推荐
黑马公开课——运行原理与GC学习笔记
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文