2020-09-18

EFCore的事务和分布式事务的使用

在操作数据库的时候,事务提交时我们必须考虑的问题,下面针对EFCore的事务进行介绍:

1.EFCore自带默认事务SaveChanges

EFCore 的一个Context连接对应的一次SaveChanges就是一个事务处理,

我们可以在一个Context里操作多个表数据,

有对一个表进行修改,对另一个表进行新增

然后一次性调用SaveChanges;

如下代码:

///DbContext SaveChanges 事务提交 事务提交   ///事务特点:要不都成功 要么都知道   using (EFCoreContext context = new EFCoreContext())   {    SysLog log = context.SysLog.FirstOrDefault(l => l.Id == 1);    context.SysLog.Remove(log);    SysUserInfo sysUserInfo1 = context.SysUserInfo.FirstOrDefault(a => a.Id == 6);    SysUserInfo sysUserInfo2 = context.Set<SysUserInfo>().Find(5);    sysUserInfo1.Name += "-11";    sysUserInfo2.Name += "-22";    context.SysLog.Add(new SysLog()    {     UserName = "测试日志",     Introduction = "描述一下"    });     context.SaveChanges();   }

 

2.IDbContextTransaction同一数据库事务处理

//如果我需要把两个SaveChange 事务一下的?    using (EFCoreContext context = new EFCoreContext())    {      IDbContextTransaction tans = null;     try     {      tans = context.Database.BeginTransaction(); //框架对事务的支持      context.SysLog.Add(new SysLog()      {       UserName = "第一次SaveChanges",       Introduction = "第一次SaveChanges",       CreateTime = DateTime.Now      });       context.SaveChanges();      context.SysLog.Add(new SysLog()      {       UserName = "第二次SaveChanges",       Introduction = "第二次SaveChanges",       CreateTime = DateTime.Now      });      context.SaveChanges();      tans.Commit(); //代码只有执行到这里事务才能生效     }     catch (Exception ex)     {      if (tans != null)      {       tans.Rollback();//事务回退      }      Console.WriteLine(ex.Message);     }     finally     {      tans.Dispose();     }    }

 

3.TransactionScope分布式事务

多个数据库之间的事务提交用TransactionScope,也就是多个Context的提交,下面模拟多个数据库的Context

如下代码:

 ///如果我需要把两个SaveChange 事务一下的?    using (EFCoreMigrationContext context1 = new EFCoreMigrationContext()) //招商银行的数据库    using (EFCoreMigrationContext context2 = new EFCoreMigrationContext())////中国银行的数据库    {     //需要引入System.Transactions.Local.dll     using (TransactionScope transactionScope = new TransactionScope())     {       try      {        context1.SysLog.Add(new SysLog()       {        UserName = "context1新增一条测试数据",        Introduction = "context1新增一条测试数据",        CreateTime = DateTime.Now       });       context1.SaveChanges();       context2.SysLog.Add(new SysLog()       {        UserName = "context2新增一条测试数据",        Introduction = "context2新增一条测试数据",        CreateTime = DateTime.Now       });        context2.SaveChanges();       transactionScope.Complete();//提交事务      }      catch (Exception ex)      {       Console.WriteLine(ex.Message);      }     }    }

 

EFCore的事务和分布式事务的使用
杨颜玩转站内促销广告google趋势wish发布产品价格限制政策,4个月内涨幅为1美元或最高20%亚马逊VAT税号零申报有什么风险?新手卖家如何遵循亚马逊政策迅田国际阿里国际站发布三大行业发展报告,分析行业热点!邮乐网购四海商舟华南理工跨境电商大讲堂2016·LAZADA周年庆典会议暨晚会大卖都在用的listing优化秘诀:亚马逊A/B测试全解!shopee的产品货源从哪来?如何的处理好供应链问题?亚马逊为什么能稳坐全球电商老大的宝座?干货:亚马逊中遇到差评和纠纷要怎么处理?跨境营销新思维:如何通过黑粉差评提升销量?

No comments:

Post a Comment