标准架构~业务层到底是否应该关注数据持久化的方式

简介:

业务层,你不能知道数据库的实现细节

这个话题也是网上谈论的非常多的,你的业务层是否会包含你的数据层的相关架构技术,如,你的数据层的持久化通过EF来实现,那么你的业务层是否也应该引入EntityFrameworks程序集?占占还是会告诉你,不应该,因为这样会使你的业务不再是纯粹的业务,它会依赖由你的数据层的持久化实现的技术,这是不对的,我们需要把业务层解藕出来,只有这样,你的数据层在进行技术切换时,业务层才不会受到影响,当然,这是理所当然的,如果你的数据库换技术了,还会影响到你的业务层,那么,你这个架构本身就是失败的!

我的EF架构失败了

在我的EF架构里,业务层使用了数据层实现的entityframeworks程序集,它知道了太多持久化的方式,所以,它是失败的,你失败,因为你让我无法简单的从一种ORM切换到别一种ORM。

失败的原因,可以理解

之所以在业务层引用entityframeworks,原因是“事务”,为了保证数据一致性,我们会在程序中加入事务块,而有时,sql2005来说,它会将本地事务不可理解的提高为分布式事务,这对于系统来说,无疑是一种负担,所以,我只能把这个事务块进行重写,重写后使它不会触发分布式事务,但同样也出现了一个惨痛的代价,那就是,一个本地事务需要具体同一个“数据上下文”,即entityframeworks里的DbContext对象,所以,BLL层就这样,依赖了EF,失败是可以理解的。

理想的事务应该放在数据层(基础设施层,持久化层)

事务总是和数据库相关,似乎与业务没什么关系,而业务层也不应该知道你的数据采用什么样的方式进行一致性的处理,一可以用SqlTransaction,也可以用TransactionScope,或者用第三方的事务组件,但归根到底,它们都是与持久化方式(ado.net的SqlTransaction,ef,linq2sql的TransactionScope)有关的,所以,放在业务层是绝对杜绝的,以下是从《Microsoft .NET企业级应用架构设计》一书中选自的一段话

数据访问层的4种主要职责:持久化、查询、管理事务、维护并发

SQL2008是美丽的

当SQLSERVER升级到2008,它似乎查觉到了什么,可能是一种坏味道,一种代码的坏味道,在SQL2005里,一个语句被发到SQL端,会reset一个SQL链接,正是一个reset导致我们的net把这个过程当成是一个分布式事务来处理,而SQL2008里,如果你的数据库是一个,那个它就会认为,你的这个过程是一个Local session的过程,即,本地会话,本地事务!

我的贡献

下面贡献一下我的SQL2005同一上下文不触发MSDTC的解决方案代码

    /// Author:zhang.zhanling
    /// 同步文章:http://www.cnblogs.com/lori/p/3455393.html
    /// 对TransactionScope,让它对同一个数据库不产生msdtc服务
    /// 环境:sql2005,sql2008本身已经解决了这个问题
    /// </summary>
    public class TransactionScopeNoMsdtc
    {
        /// <summary>
        /// 产生包裹事务
        /// 维持一个connection连接对象
        /// </summary>
        /// <param name="db">数据上下文</param>
        /// <param name="isOutest">是否为最外层,默认为false</param>
        /// <param name="action">处理代码块</param>
        public static void UsingNoMsdtc(IUnitOfWork db, bool isOutest, Action action)
        {
            var objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)db).ObjectContext;
            try
            {

                if (objectContext.Connection.State == System.Data.ConnectionState.Closed)
                    objectContext.Connection.Open();

                using (TransactionScope trans = new TransactionScope())
                {
                    action();
                    trans.Complete();
                }
            }
            finally
            {
                if (isOutest)//如果是最外层事务,再将连接关闭!内部事务与外部事务需要共用一个Connection的连接
                    objectContext.Connection.Close(); //只能关闭,不能dispose,因为dispose之后,上下文就无法得到链接串了
            }
        }
        /// <summary>
        /// 产生包裹事务,它不是最外层的,如果是最外层的需要调用其它重载
        /// </summary>
        /// <param name="db"></param>
        /// <param name="action"></param>
        public static void UsingNoMsdtc(IUnitOfWork db, Action action)
        {
            UsingNoMsdtc(db, false, action);
        }

    }

 本文转自博客园张占岭(仓储大叔)的博客,原文链接:标准架构~业务层到底是否应该关注数据持久化的方式,如需转载请自行联系原博主。

目录
相关文章
|
4月前
|
消息中间件 存储 缓存
十万订单每秒热点数据架构优化实践深度解析
【11月更文挑战第20天】随着互联网技术的飞速发展,电子商务平台在高峰时段需要处理海量订单,这对系统的性能、稳定性和扩展性提出了极高的要求。尤其是在“双十一”、“618”等大型促销活动中,每秒需要处理数万甚至数十万笔订单,这对系统的热点数据处理能力构成了严峻挑战。本文将深入探讨如何优化架构以应对每秒十万订单级别的热点数据处理,从历史背景、功能点、业务场景、底层原理以及使用Java模拟示例等多个维度进行剖析。
84 8
|
4月前
|
存储 分布式计算 数据挖掘
数据架构 ODPS 是什么?
数据架构 ODPS 是什么?
863 7
|
4月前
|
数据采集 搜索推荐 数据管理
数据架构 CDP 是什么?
数据架构 CDP 是什么?
128 2
|
20天前
|
存储 数据采集 人工智能
AllData数据中台架构全览:数据时代的智慧中枢
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
5天前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
13 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
4月前
|
数据管理 Nacos 开发者
"Nacos架构深度解析:一篇文章带你掌握业务层四大核心功能,服务注册、配置管理、元数据与健康检查一网打尽!"
【10月更文挑战第23天】Nacos 是一个用于服务注册发现和配置管理的平台,支持动态服务发现、配置管理、元数据管理和健康检查。其业务层包括服务注册与发现、配置管理、元数据管理和健康检查四大核心功能。通过示例代码展示了如何在业务层中使用Nacos,帮助开发者构建高可用、动态扩展的微服务生态系统。
182 0
|
6月前
|
存储 搜索推荐 数据库
MarkLogic在微服务架构中的应用:提供服务间通信和数据共享的机制
随着微服务架构的发展,服务间通信和数据共享成为关键挑战。本文介绍MarkLogic数据库在微服务架构中的应用,阐述其多模型支持、索引搜索、事务处理及高可用性等优势,以及如何利用MarkLogic实现数据共享、服务间通信、事件驱动架构和数据分析,提升系统的可伸缩性和可靠性。
78 5
|
5月前
|
存储 大数据 数据处理
洞察未来:数据治理中的数据架构新思维
数据治理中的数据架构新思维对于应对未来挑战、提高数据处理效率、加强数据安全与隐私保护以及促进数据驱动的业务创新具有重要意义。企业需要紧跟时代步伐,不断探索和实践新型数据架构,以洞察未来发展趋势,为企业的长远发展奠定坚实基础。
|
7月前
|
安全 网络安全 数据安全/隐私保护
云原生技术探索:容器化与微服务架构的实践之路网络安全与信息安全:保护数据的关键策略
【8月更文挑战第28天】本文将深入探讨云原生技术的核心概念,包括容器化和微服务架构。我们将通过实际案例和代码示例,展示如何在云平台上实现高效的应用部署和管理。文章不仅提供理论知识,还包含实操指南,帮助开发者理解并应用这些前沿技术。 【8月更文挑战第28天】在数字化时代,网络安全和信息安全是保护个人和企业数据的前线防御。本文将探讨网络安全漏洞的成因、加密技术的应用以及提升安全意识的重要性。文章旨在通过分析网络安全的薄弱环节,介绍如何利用加密技术和提高用户警觉性来构建更为坚固的数据保护屏障。
|
7月前
|
Java 数据库连接 微服务
揭秘微服务架构下的数据魔方:Hibernate如何玩转分布式持久化,实现秒级响应的秘密武器?
【8月更文挑战第31天】微服务架构通过将系统拆分成独立服务,提升了可维护性和扩展性,但也带来了数据一致性和事务管理等挑战。Hibernate 作为强大的 ORM 工具,在微服务中发挥关键作用,通过二级缓存和分布式事务支持,简化了对象关系映射,并提供了有效的持久化策略。其二级缓存机制减少数据库访问,提升性能;支持 JTA 保证跨服务事务一致性;乐观锁机制解决并发数据冲突。合理配置 Hibernate 可助力构建高效稳定的分布式系统。
98 0

热门文章

最新文章