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

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

作者头像
SpiritLing
发布2022-09-22 16:57:22
4620
发布2022-09-22 16:57:22
举报
文章被收录于专栏:SpiritLing

例子

参考官方例子

代码语言:javascript
复制
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
复制
    // .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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 例子
  • 解析源码
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档