跨多个DbContext的EF核心事务与队列消息

时间:2018-10-17 07:05:21

标签: c# .net-core ef-core-2.0 ef-core-2.1

跨多个DbContex存储/更新数据时使用什么方法? 性能比较:以及在什么情况下使用什么:

 using (var scope = new TransactionScope())
        {
            using (var context1 = new ItemContext(userOptions))
            {
                context1.Items.Add(item);
                context1.SaveChanges();
            }

            using (var context2 = new OrderContext(orderOptions))
            {
                testOrder.ItemId = item.Id;
                context2.Orders.Add(testOrder);
                context2.SaveChanges();
            }

            if(testOrder.SunIsShining){
               using (var context1 = new ItemContext(itemOptions))
               {
                  item.SunIsShining= true;
                  context1.Items.Update(item);
                  context1.SaveChanges();
               }
            }
            scope.Complete();
        }

A。上面的示例使用事务作用域并在同一物理服务器的不同上下文之间更改/更新记录。

B。使用消息。例如,将用户保存到db之后。呼叫消息服务,该服务会将信息msg插入队列(项目信息记录)。  然后,ItemOrderProcessingService将每10秒读取一次该队列,并在其中获取所有新记录。  并分批创建订单,如果需要的话,也许还可以在项目表中分批更新某些项目状态。  (如果需要,具有回滚更改的逻辑)

何时使用哪种方法,优点/缺点是什么? f.e.如果我们每天有约2000笔交易,那是相当低的.. 每天应该使用B.队列方法处理多少笔交易?

1 个答案:

答案 0 :(得分:1)

这是完全不同的方法。使用事务时,对所有上下文进行回滚要简单得多。在基于消息的系统中,直到所有服务都将处理您的消息之前,还需要一些时间,并且您还应该处理服务失败并检查数据一致性

基于消息的消息需要团队付出更多的努力来维护和支持微服务来处理消息,对于像您这样的小型应用程序,使用整体应用程序是可以的。