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为禁用状态

本文转自博客园张占岭(仓储大叔)的博客,原文链接:DDD~领域事件中使用分布式事务,如需转载请自行联系原博主。

目录
相关文章
|
存储 消息中间件 人工智能
领域事件与CQRS:分布式系统设计的新范式
领域事件与CQRS:分布式系统设计的新范式
|
存储 运维 Linux
小概率事件对分布式系统的挑战 | 学习笔记
快速学习小概率事件对分布式系统的挑战
161 0
小概率事件对分布式系统的挑战 | 学习笔记
|
消息中间件 Java Kafka
分布式系统理论基础3: 时间、时钟和事件顺序
分布式系统理论基础 - 时间、时钟和事件顺序 2016-05-03 10:58 by bangerlee, 7436 阅读, 3 评论, 收藏, 编辑   十六号…… 四月十六号。
|
消息中间件 缓存 NoSQL
[.NET领域驱动设计实战系列]专题八:DDD案例:网上书店分布式消息队列和分布式缓存的实现
原文:[.NET领域驱动设计实战系列]专题八:DDD案例:网上书店分布式消息队列和分布式缓存的实现 一、引言    在上一专题中,商家发货和用户确认收货功能引入了消息队列来实现的,引入消息队列的好处可以保证消息的顺序处理,并且具有良好的可扩展性。
1904 0
|
机器学习/深度学习 人工智能 算法
AI大事件 | 人类理解行为数据集推出,Uber发布自家分布式深度学习框架
呜啦啦啦啦啦大家好呀,又到了本周的AI大事件时间了。过去的一周中AI圈都发生了什么?大佬们互撕了哪些问题?研究者们发布了哪些值得一读的论文?又有哪些开源的代码和数据库可以使用了?文摘菌带你盘点过去一周AI大事件! 新闻 AlphaGo Zero: 从零开始的学习 来源:DEEPMIND.
1638 0
|
15天前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
|
3月前
|
NoSQL Redis
基于Redis的高可用分布式锁——RedLock
这篇文章介绍了基于Redis的高可用分布式锁RedLock的概念、工作流程、获取和释放锁的方法,以及RedLock相比单机锁在高可用性上的优势,同时指出了其在某些特殊场景下的不足,并提到了ZooKeeper作为另一种实现分布式锁的方案。
99 2
基于Redis的高可用分布式锁——RedLock
|
3月前
|
缓存 NoSQL Java
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
这篇文章是关于如何在SpringBoot应用中整合Redis并处理分布式场景下的缓存问题,包括缓存穿透、缓存雪崩和缓存击穿。文章详细讨论了在分布式情况下如何添加分布式锁来解决缓存击穿问题,提供了加锁和解锁的实现过程,并展示了使用JMeter进行压力测试来验证锁机制有效性的方法。
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】

热门文章

最新文章