将不确定变为确定~transactionscope何时提升为分布式事务?(sql2005数据库解决提升到MSDTC的办法)

简介:

对于transactionscope不了解的同学,可以看我的相关文章

 

第二十六回   将不确定变为确定~transactionscope何时提升为分布式事务?

第二十七回   将不确定变为确定~transactionscope何时提升为分布式事务~续

第二十八回   将不确定变为确定~transactionscope何时提升为分布式事务~再续(避免引起不必要的MSDTC)

第二十九回   将不确定变为确定~transactionscope何时提升为分布式事务~大结局

第三十七回   将不确定变为确定~transactionscope何时提升为分布式事务~SQL2005与SQL2008不同

声明:

对于这种事务,如果希望程序出错自动回滚,必须将异常throw出来,不能愉愉的用日志记录!

测试:

对于sql2008已经很好的支持了transactionscope,而对于sql2005来说,支持的不是很好,它将多个savechanges()方法提升为分布式事务msdtc,它不管你是否为一个数据库,真是无奈了!还好,最好找到了解决方法,下面图所示,将多个insert,update包裹到一个transactionscope里,所产生的结果如下:

简单来说,就是sp_reset_connection重新使用一次SQL链接时,你的事务里的代码是被包裹在一起发送过来的,这时,如果有一条SQL语句出现异常,整个包会发生callback!

上面图中,只要有一条语句出现SQL异常,都会发生回滚,从而保证了数据的完整性。

当然,我们的计算机中,并没有开启msdtc服务,有图有真像

前提:Db数据上下文对象必须与action指向的方法体里的上下文是同一个。

相关原始代码为:

    var objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)Db).ObjectContext;
            try
            {
                objectContext.Connection.Open();
                using (TransactionScope trans = new TransactionScope())
                {
                insert1();
                insert2();
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                objectContext.Connection.Close();
            }

OK,我们将上面代码进行一个封装,让它访问起来更方便一些,看代码:

 /// <summary>
    /// Author:zhang.zhanling
    /// 对TransactionScope,让它对同一个数据库不产生msdtc服务
    /// </summary>
    public class TransactionScopeNoMsdtc
    {
        /// <summary>
        /// 产生包裹事务
        /// </summary>
        /// <param name="db">数据上下文</param>
        /// <param name="isOutermost">是否为最外层,默认为false</param>
        /// <param name="action">处理代码块</param>
        public static void UsingNoMsdtc(DbContext db, bool isOutermost, 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 (isOutermost)//如果是最外层事务,而将连接关闭
                    objectContext.Connection.Close();
            }
        }
        /// <summary>
        /// 产生包裹事务,它不是最外层的,如果是最外层的需要调用其它重载
        /// </summary>
        /// <param name="db"></param>
        /// <param name="action"></param>
        public static void UsingNoMsdtc(DbContext db, Action action)
        {
            UsingNoMsdtc(db, false, action);
        }
    }

在使用时,我们可以这样来做,不用TransactionScope,而是用TransactionScopeNoMsdtc呵呵。

   EntityFrameworks.Data.Core.TransactionScopeNoMsdtc.UsingNoMsdtc(Db, () =>
            {
            insert1();
            insert2();
            });

感谢阅读!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:将不确定变为确定~transactionscope何时提升为分布式事务?(sql2005数据库解决提升到MSDTC的办法),如需转载请自行联系原博主。

目录
相关文章
|
4月前
|
SQL 机器学习/深度学习 人工智能
从“写SQL”到“聊数据”:NL2SQL如何用自然语言解锁数据库?
本文系统性地阐述了自然语言转SQL(NL2SQL) 技术如何让非技术背景的业务分析师实现数据自助查询,从而提升数据驱动决策的效率与准确性。
从“写SQL”到“聊数据”:NL2SQL如何用自然语言解锁数据库?
|
3月前
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
367 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
|
2月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
187 6
|
4月前
|
SQL 人工智能 Java
用 LangChain4j+Ollama 打造 Text-to-SQL AI Agent,数据库想问就问
本文介绍了如何利用AI技术简化SQL查询操作,让不懂技术的用户也能轻松从数据库中获取信息。通过本地部署PostgreSQL数据库和Ollama模型,结合Java代码,实现将自然语言问题自动转换为SQL查询,并将结果以易懂的方式呈现。整个流程简单直观,适合初学者动手实践,同时也展示了AI在数据查询中的潜力与局限。
439 8
|
4月前
|
SQL 人工智能 Linux
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
266 5
|
5月前
|
存储 监控 分布式数据库
ClickHouse分布式数据库动态伸缩(弹性扩缩容)的实现
实现ClickHouse数据库的动态伸缩需要持续的维护和精细的操作。从集群配置到数据迁移,再到监控和自动化,每一步都要仔细管理以确保服务的可靠性和性能。这些活动可以显著提高应用的响应性和成本效率,帮助业务根据实际需求灵活调整资源分配。
329 10
|
5月前
|
SQL 缓存 监控
SqlRest让SQL秒变Http API,还支持20+数据库(含国产数据库)
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
5月前
|
SQL 存储 数据库
SQL Server Management Studio (SSMS) 21 - 微软数据库管理工具
SQL Server Management Studio (SSMS) 21 - 微软数据库管理工具
943 0
|
6月前
|
存储 关系型数据库 分布式数据库
【赵渝强老师】基于PostgreSQL的分布式数据库:Citus
Citus 是基于 PostgreSQL 的开源分布式数据库,采用 shared nothing 架构,具备良好的扩展性。它以插件形式集成,部署简单,适用于处理大规模数据和高并发场景。本文介绍了 Citus 的基础概念、安装配置步骤及其在单机环境下的集群搭建方法。
492 2

热门文章

最新文章