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~领域事件中使用分布式事务,如需转载请自行联系原博主。

目录
相关文章
|
5月前
|
设计模式 存储 缓存
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
64 0
|
存储 消息中间件 人工智能
领域事件与CQRS:分布式系统设计的新范式
领域事件与CQRS:分布式系统设计的新范式
|
存储 运维 Linux
小概率事件对分布式系统的挑战 | 学习笔记
快速学习小概率事件对分布式系统的挑战
小概率事件对分布式系统的挑战 | 学习笔记
|
消息中间件 Java Kafka
分布式系统理论基础3: 时间、时钟和事件顺序
分布式系统理论基础 - 时间、时钟和事件顺序 2016-05-03 10:58 by bangerlee, 7436 阅读, 3 评论, 收藏, 编辑   十六号…… 四月十六号。
|
消息中间件 缓存 NoSQL
[.NET领域驱动设计实战系列]专题八:DDD案例:网上书店分布式消息队列和分布式缓存的实现
原文:[.NET领域驱动设计实战系列]专题八:DDD案例:网上书店分布式消息队列和分布式缓存的实现 一、引言    在上一专题中,商家发货和用户确认收货功能引入了消息队列来实现的,引入消息队列的好处可以保证消息的顺序处理,并且具有良好的可扩展性。
1913 0
|
机器学习/深度学习 人工智能 算法
AI大事件 | 人类理解行为数据集推出,Uber发布自家分布式深度学习框架
呜啦啦啦啦啦大家好呀,又到了本周的AI大事件时间了。过去的一周中AI圈都发生了什么?大佬们互撕了哪些问题?研究者们发布了哪些值得一读的论文?又有哪些开源的代码和数据库可以使用了?文摘菌带你盘点过去一周AI大事件! 新闻 AlphaGo Zero: 从零开始的学习 来源:DEEPMIND.
1647 0
|
2月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
|
18天前
|
存储 NoSQL Java
使用lock4j-redis-template-spring-boot-starter实现redis分布式锁
通过使用 `lock4j-redis-template-spring-boot-starter`,我们可以轻松实现 Redis 分布式锁,从而解决分布式系统中多个实例并发访问共享资源的问题。合理配置和使用分布式锁,可以有效提高系统的稳定性和数据的一致性。希望本文对你在实际项目中使用 Redis 分布式锁有所帮助。
47 5
下一篇
DataWorks