zoukankan      html  css  js  c++  java
  • DDD~领域事件中使用分布式事务

    回到目录

    对于一个聚合来说,它可能会被附加很多事件,这里我们叫它领域事务,因为一个聚会我们可以把它理解成一个领域,一个业务。对于领域事件不清楚的同学可以看看我的这篇文章《DDD~领域事件与事件总线》,里面有详细的说明,今天主要说一下领域里的事务,即领域事件的数据处理和主逻辑里的数据处理在同一事务里完成。

    知识准备

    SQL2005环境使用TransactionScopeNoMsdtc事务,它是占占开发的,原理是将一批操作包裹到一个SqlConnection里,由开发者维护接连的关闭,这也是使用时要特别注意的地方,因为如果不关闭连接,SQL链接池会益出。

    SQL2008环境使用微软自己的分布式事务实现TransactionScope,它对于同一个上下文来说,是不会被提升为分布式事务的,这一点对SQL2005要强很多。

    代码实践

      /// <summary>
        /// 添加WebSystem表时,所需要的事件对象
        /// </summary>
        [Serializable]
        public class WebSystemCreateEvent : EventBase
        {
            /// <summary>
            /// 数据上下文,它与架构无关,可以是Linq2Sql,EF,ADO.NET
            /// </summary>
            public IUnitOfWork UnitOfWork { get; set; }
            /// <summary>
            /// 对象主键
            /// </summary>
            public int ID { get; set; }
        }
          [HttpPost]
            public ActionResult WebSystem(FormCollection form)
            {
                //订阅领域事件
                EventBus.Instance.Subscribe<WebSystemCreateEvent>(i =>
                {
                    var entity1 = new DbContextRepository<WebSystem>(i.UnitOfWork).Find(i.ID);
                    entity1.WebSystemName = entity1.WebSystemName + "更新了";
                    new DbContextRepository<WebSystem>(i.UnitOfWork).Update(entity1);
                });
    
                IUnitOfWork UnitOfWork = new backgroundEntities1();
                var db = new DbContextRepository<WebSystem>(UnitOfWork);
    
                using (TransactionScope trans = new TransactionScope())
                {
                    var entity = new WebSystem
                    {
                        Info = form["Info"],
                        Status = Convert.ToInt32(form["Status"]),
                        WebSystemName = form["WebSystemName"]
                    };
                    db.Insert(entity);
                    //发布领域事务
                    EventBus.Instance.Publish(new WebSystemCreateEvent
                    {
                        ID = entity.WebSystemID,
                        UnitOfWork = UnitOfWork,
                    });
                    trans.Complete();
                }
    
    
    
    
                return RedirectToAction("WebSystemList");
            }

    SQL截图

    TransactionScopeNoMsdtc截图

    TransactionScope截图

    本地WWW网站服务器的MSDTC为禁用状态

    回到目录

  • 相关阅读:
    图片垂直居中的方法(适合只有一行文字和图片)
    微信小程序 this.setData() 详解
    phpstorm 2017激活码(方法)
    WebSocket 协议 详解
    容器装不下内容时,显示滚动条
    Restore IP Addresses
    Reverse Linked List II
    Subsets II
    Decode Ways
    Gray Code
  • 原文地址:https://www.cnblogs.com/lori/p/3611269.html
Copyright © 2011-2022 走看看