EF Core的三种事务

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