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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java path环境变量_java配置环境变量

    java path环境变量_java配置环境变量前段时间因为windows10更新的缘故,系统越来越卡,任务管理器也闪退,试了各种方法都不管用,反而越改问题越多,乘着周末,昨天把系统重装了,现在记录一下配置java环境变量的过程。1.安装jdk,从官网下就行,我的是把原来的做了个备份,直接解压的。如下图2.记录下你要配置的jdk路径。右键此电脑,属性,点击高级系统设置,选择环境变量。3.现在就可以新建环境变量了。点击新建,变量名为JAVA_HO…

    2022年5月31日
    22
  • 激光slam理论与实践_SLAM算法

    激光slam理论与实践_SLAM算法激光SLAM笔记(1)——激光SLAM框架和基本数学理论1、SLAM分类1.1、基于传感器的分类1.2、基于后端的分类2、激光SLAM算法(基于优化的算法)2.1、激光SLAM算法的流程2.2、激光SLAM常用算法2.3、激光SLAM在实际环境中的问题3、激光SLAM算法介绍3.1、2D激光SLAM3.2、3D激光SLAM1、SLAM分类1.1、基于传感器的分类1.2、基于后端的分类 …

    2022年8月23日
    8
  • 外包公司的程序员一般做啥工作?_程序员在外包公司有发展吗

    外包公司的程序员一般做啥工作?_程序员在外包公司有发展吗公众号后台回复“图书“,了解更多号主新书内容作者:年素清来源:码农故事汇01码农故事汇张向阳的学历远达不到百度阿里腾讯等IT大厂的招聘要求,虽然他是根正苗红的计算机科班出身,可学历…

    2022年9月27日
    4
  • 怎样背英语单词才高效?有哪些好方法?(如何高效的背英语单词)

    原文地址:https://www.zhihu.com/question/19580414何宜晖CSundergrad,CV,DL,ML单词视频下载方式:微盘http://vdisk.weibo.com/lc/T7ktJoSaPlIlVW0a8密码:X3J8直接下载压缩包http://yihui-he.github.io/TOEFL-10000-0/(通过github,速度可能比较慢…

    2022年4月15日
    31
  • 服务器的cd驱动器怎么修改盘符,更改dvd驱动器盘符,cd驱动器盘符改「建议收藏」

    服务器的cd驱动器怎么修改盘符,更改dvd驱动器盘符,cd驱动器盘符改「建议收藏」有部分win7系统用户反映说,当他在电脑中安装了虚拟光驱之后,电脑就会产生好多个无效的驱动器盘符,所以就将要将它们删除掉,可以却发现右击的菜单中找不到删除选项,也无法弹出光驱,导致无法删除无效驱动器盘符,这要怎么办呢?接下来给大家分享一下Win7系统删除无效驱动器盘符右键没有删除选项要怎么解决吧!推荐:1、点击win7系统的开始菜单,右击计算机,选择管理选项卡,进入计算机管理;2、打开计算机管理后…

    2022年5月31日
    171
  • 进程与线程

    进程与线程进程我们都知道计算机的核心是CPU,它承担了所有的计算任务,而操作系统是计算机的管理者,它负责任务的调度,资源的分配和管理,统领整个计算机硬件;应用程序是具有某种功能的程序,程序是运行于操作系统之

    2022年7月1日
    24

发表回复

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

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