TransactionScope 的基本原理简介

TransactionScope 的基本原理简介C#的事务编程1Db事务DbConnection中创建基于当前连接的DbTransaction2使用TransactionScope,创建环境事务一旦创建,在这个环境包含的DbCo

大家好,又见面了,我是你们的朋友全栈君。

C# 的事务编程

1 Db事务 

  DbConnection 中创建基于当前连接的 DbTransaction

 

2  使用TransactionScope ,创建环境事务

  一旦创建,在这个环境包含的DbConnection 实例 都会根据连接字符串中的

Sqlserver 连接字符串支持,是否自动附加当前环境事务.

连接字符串关键字(Enlist)
       SqlConnection.ConnectionString 属性支持关键字 Enlist,该关键字指示 System.Data.SqlClient 是否将检测事务上下文并自动在分布式事务中登记连接。 如果 Enlist=true,连接将自动在打开的线程的当前事务上下文中登记。 如果 Enlist=false,SqlClient 连接不会与分布式事务进行交互。 Enlist 的默认值为 true。 如果连接字符串中未指定 Enlist,若在连接打开时检测到一个,连接将自动在分布式事务中登记。  

Server=(local)SQL2005;Database=Northwind;Integrated Security=SSPI;auto-enlist=false

Mysql 等其他 OLDP数据库 需要驱动支持。

 

<span role="heading" aria-level="2">TransactionScope 的基本原理简介
 
<span role="heading" aria-level="2">TransactionScope 的基本原理简介
<span role="heading" aria-level="2">TransactionScope 的基本原理简介
 
 
<span role="heading" aria-level="2">TransactionScope 的基本原理简介
 

以下来自MSDN:

Transaction 类,以及隐式编程模型使用 TransactionScope 类,在其中事务自动管理基础结构。

System_CAPS_important重要事项

TransactionScope 类,以便为您自动管理环境事务上下文。TransactionScope 和 DependentTransaction 跨多个函数调用或多个线程调用需要使用相同的事务的应用程序的类。Implementing An Implicit Transaction Using Transaction Scope 主题。Writing A Transactional Application。

 

TransactionScope 通过 new 语句中,事务管理器确定哪些事务参与进来。 一旦确定,该范围将始终参与该事务。 环境事务是在代码中执行的事务。Current 类的静态 Transaction 属性,获取对环境事务的引用。Implementing An Implicit Transaction Using Transaction Scope 主题。

TransactionScope 对象并调用其 Dispose 方法),则范围所参与的事务可以继续。 如果在事务范围内发生异常,参与到其中的事务将回滚。

Complete 方法一次,以通知该事务管理器是可接受,即可提交事务。 未能调用此方法中止事务。

Dispose 方法将标记事务范围的末尾。 在调用此方法之后所发生的异常不会影响事务。

Current 内某个范围内,将引发异常时 Dispose 调用。 但是,在作用域结束时,以前的值被还原。Dispose 上 Current 在事务范围创建事务,事务将中止范围的末尾。

 

// This function takes arguments for 2 connection strings and commands to create a transaction 
// involving two SQL Servers. It returns a value > 0 if the transaction is committed, 0 if the 
// transaction is rolled back. To test this code, you can connect to two different databases 
// on the same server by altering the connection string, or to another 3rd party RDBMS by 
// altering the code in the connection2 code block.
static public int CreateTransactionScope(
    string connectString1, string connectString2,
    string commandText1, string commandText2)
{
    // Initialize the return value to zero and create a StringWriter to display results.
    int returnValue = 0;
    System.IO.StringWriter writer = new System.IO.StringWriter();

    try
    {
        // Create the TransactionScope to execute the commands, guaranteeing
        // that both commands can commit or roll back as a single unit of work.
        using (TransactionScope scope = new TransactionScope())
        {
            using (SqlConnection connection1 = new SqlConnection(connectString1))
            {
                // Opening the connection automatically enlists it in the 
                // TransactionScope as a lightweight transaction.
                connection1.Open();

                // Create the SqlCommand object and execute the first command.
                SqlCommand command1 = new SqlCommand(commandText1, connection1);
                returnValue = command1.ExecuteNonQuery();
                writer.WriteLine("Rows to be affected by command1: {0}", returnValue);

                // If you get here, this means that command1 succeeded. By nesting
                // the using block for connection2 inside that of connection1, you
                // conserve server and network resources as connection2 is opened
                // only when there is a chance that the transaction can commit.   
                using (SqlConnection connection2 = new SqlConnection(connectString2))
                {
                    // The transaction is escalated to a full distributed
                    // transaction when connection2 is opened.
                    connection2.Open();

                    // Execute the second command in the second database.
                    returnValue = 0;
                    SqlCommand command2 = new SqlCommand(commandText2, connection2);
                    returnValue = command2.ExecuteNonQuery();
                    writer.WriteLine("Rows to be affected by command2: {0}", returnValue);
                }
            }

            // The Complete method commits the transaction. If an exception has been thrown,
            // Complete is not  called and the transaction is rolled back.
            scope.Complete();

        }

    }
    catch (TransactionAbortedException ex)
    {
        writer.WriteLine("TransactionAbortedException Message: {0}", ex.Message);
    }
    catch (ApplicationException ex)
    {
        writer.WriteLine("ApplicationException Message: {0}", ex.Message);
    }

    // Display messages.
    Console.WriteLine(writer.ToString());

    return returnValue;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154885.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 树莓派python编程自学-树莓派Python编程指南 中文PDF扫描版

    《树莓派Python编程指南》共12章:第1~3章深入介绍如何在树莓派上使用Python,为学习其他知识打下基础;第4章介绍使用Qt工具包开发图形用户界面;第5章介绍在Python中创建游戏;第6章介绍如何利用GPU来使用OpenGL创建3D场景;第7章讲解如何从网页上抓取信息或使用树莓派为全世界提供内容和服务;第8章介绍使用Python在树莓派中构建自己的游戏世界;第9章使用Python在树莓派…

    2022年4月8日
    134
  • Velocity语法大全

    Velocity语法大全一、基本语法 1、”#”用来标识Velocity的脚本语句,包括#set、#if、#else、#end、#foreach、#end、#iinclude、#parse、#macro等; 如: #if($info.imgs) <imgsrc=”$info.imgs”border=0> #else <imgsrc=”noPhoto.jpg”> #end2、”$”用来标识一个对象(或理解为…

    2022年7月14日
    15
  • Reactor模式详解

    Reactor模式详解在学习Reactor模式之前,我们需要对“I/O的四种模型”以及“什么是I/O多路复用”进行简单的介绍,因为Reactor是一个使用了同步非阻塞的I/O多路复用机制的模式。I/O的四种模型I/0

    2022年8月2日
    13
  • ubuntu 20.04.1 LTS_visi20安装教程

    ubuntu 20.04.1 LTS_visi20安装教程UbuntuServer20.04LTS下载及安装教程

    2025年10月9日
    5
  • jsp页面数据格式化

    jsp页面数据格式化本来以为数据格式化很简单 但是在今天的工作中发现自己确实有很多的不足 由于系统分模块开发 导致了 jsp 页面的 el 表达式 struts2 标签 以及页面样式的不同 让我经历了 3 个不同的页面格式化阶段 一 页面 js 的数据格式化 nbsp nbsp nbsp nbsp nbsp nbsp nbsp 工作项目中用到的是 easyui 的页面 nbsp nbsp nbsp nbsp nbsp nbsp 金额格式化 varDM digit 2 小数点位

    2025年9月16日
    3
  • 运维人员常用到的11款服务器监控工具「建议收藏」

    运维人员常用到的11款服务器监控工具「建议收藏」目录1、zabbix2、Nagios3、PerformanceCo-Pilot4、Anturis5、SeaLion6、Icinga7、Munin8、Monit9、SimpleServerMonitor10、SysUsage11、Pingdom1、zabbixzabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。abbix能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决

    2022年5月2日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号