EFCore的事務和分佈式事務的使用

在操做數據庫的時候,事務提交時咱們必須考慮的問題,下面針對EFCore的事務進行介紹:數據庫

1.EFCore自帶默認事務SaveChanges框架

EFCore 的一個Context鏈接對應的一次SaveChanges就是一個事務處理,分佈式

咱們能夠在一個Context裏操做多個表數據,測試

有對一個表進行修改,對另外一個表進行新增spa

而後一次性調用SaveChanges;日誌

以下代碼:code

///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同一數據庫事務處理blog

//若是我須要把兩個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的提交,下面模擬多個數據庫的Contextit

以下代碼:

 ///若是我須要把兩個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);
                        }
                    }
                }
相關文章
相關標籤/搜索