概述
有一次小白面试回来说,面试官问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的三种事务的使用,案例是比较简单的用法,具体还有多上下文的事务、分布式事务等,由于篇幅有限大家自己可以研究一下,本案例仅供参考,具体根据您的项目来实践。再来说一下面试,问这种问题主要是考察你对代码的熟悉程度,一般长时间不用一时想不起很正常,并不代表你不会。希望本文对你有所帮助,欢迎留言和提出异议。
版权声明:本文来源于网友收集或网友提供,仅供学习交流之用,如果有侵权,请转告版主或者留言,本公众号立即删除。
技术群:添加小编微信并备注进群
小编微信:mm1552923 公众号:dotNet编程大全
最后
以上就是单纯夏天为你收集整理的小白面试:EF Core的三种事务的全部内容,希望文章能够帮你解决小白面试:EF Core的三种事务所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复