• 在EF Core中如何使用事务?
  • 发布于 2个月前
  • 871 热度
    0 评论
  • 乌龙山
  • 0 粉丝 48 篇博客
  •   
 有一次小白面试回来说,面试官问EF Core怎么实现,他当时懵逼了,之前写过但是长时间不用了,最近的事务还是用第三方封装的方法,早忘记原生的怎么写了。本文将替小白回答这个问题,而且有三种实现方法。

    事务这个功能一般在批量插入或者修改多个数据表时用到,操作过程中要么都成功,要么都失败,来保证数据的一致性。使用场景比如支付转账、图书馆借书书等。EF Core有三种以上的方法实现,本文介绍比较通用的三种方法。

一、SaveChanges(默认事务)
在默认的情况下,如果使用EF的SavaChanges操作多表或多条数据的保存,它是支持事务的。当然如果不想用也可以关闭默认的事务。上代码
 using (ApplicationDbContext db=new ApplicationDbContext(options))
 {
     try
     {
         //关闭SaveChanges的默认事务 事务就不会起作用
         // db.Database.AutoTransactionsEnabled = false;
         db.Customers.Add(new Customer() { Name = "梁朝伟", Age = 11, Email = "lcw@qq.com" });
         db.Customers.Add(new Customer() { Name = "张曼玉", Age = 55, Email = "zmy@qq.com" });
         db.SaveChanges();//
     }
     catch (Exception)
     {
         Console.WriteLine("如果出错了,两条数据都没有执行成功");
     }
 }
二、DbContextTransaction(BeginTransaction)
    BeginTransaction也是常用的事务,在ADO.NET中也可以使用(SqlBeginTransaction)。功能有开启事务、Commit提交事务、Rollback回滚事务、Dispose销毁,用Using包裹的话,就不需要写Rollback关键字,它会自动回滚。如果不用Using包裹事务,就需要在Catch中手动RollBack回滚,并且最好最后手动的Dispose一下。上代码
using (ApplicationDbContext db = new ApplicationDbContext(options))
 {
     using(var transaction= db.Database.BeginTransaction())
     {
         try
         {
             db.Customers.Add(new Customer() { Name = "梁朝伟", Age = 11, Email = "lcw@qq.com" });
             db.SaveChanges();
             db.Customers.Add(new Customer() { Name = "张曼玉", Age = 55, Email = "zmy@qq.com" });
             db.SaveChanges();
             //提交事务
             transaction.Commit();
         }
         catch (Exception)
         {
             //回归事务,在try不需要,报错后不会提交事务
             //transaction.Rollback();
             //transaction.Dispose();
         }
        
     }
 }
三、TransactionScope(环境事务)
    TransactionScope是.Net 2.0之后的新特征,它的用途是为数据库访问提供了一个“轻量级”[区别于:SqlTransaction]的事物。功能有Complete提交事务、 Transaction.Current.Rollback()回滚事务、Dispose销毁对象。跟BeginTransaction一样如果用Using包裹的话不需要写回滚和销毁。上代码:
 using (ApplicationDbContext db = new ApplicationDbContext(options))
 {
     using (var scope = new TransactionScope())
     {
         try
         {
             db.Customers.Add(new Customer() { Name = "梁朝伟", Age = 11, Email = "lcw@qq.com" });
             db.SaveChanges();
             db.Customers.Add(new Customer() { Name = "张曼玉", Age = 55, Email = "zmy@qq.com" });
             db.SaveChanges();
             //提交事务
             scope.Complete();
         }
         catch (Exception)
         {
         }

     }
 }
结语
    上面列举了EF Core的三种事务的使用,案例是比较简单的用法,具体还有多上下文的事务、分布式事务等,由于篇幅有限大家自己可以研究一下,本案例仅供参考,具体根据您的项目来实践。再来说一下面试,问这种问题主要是考察你对代码的熟悉程度,一般长时间不用一时想不起很正常,并不代表你不会。希望本文对你有所帮助,欢迎留言和提出异议。
用户评论