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


相关推荐

  • MapReduce编程实例(一)

    MapReduce编程实例(一)前提准备:1.hadoop安装运行正常,请参考2.集成开发环境正常,请参考Ubuntu搭建Hadoop源码阅读环境开发示例:WordCount本示例详细的介绍如何在集成环境中运行第一个MapReduce程序WordCount

    2022年6月18日
  • 平行四边形符号怎么打出来_几何画板如何打平行四边形符号

    平行四边形符号怎么打出来_几何画板如何打平行四边形符号平行四边形符号是两组对边平行的四边形,平行四边形符号有两种,空心和实心“▰▱”。 ▱ ▰ ◇ ◆ 平行四边形符号怎么打?1、在QQ聊天窗口中,按住Alt键别松开,然后在数字键区依次按9649松开Alt键就是“▱”,同理按9648就是平行四边形符号“▰”。2、在Word或Execl中画出平行四边形,点击“…

    2022年4月19日
  • TLSF算法分析[通俗易懂]

    TLSF算法分析[通俗易懂]注:本文的大部分内容摘录自论文《TLSF:aNewDynamicMemoryAllocatorforReal-TimeSystems》,可以通过“科学上网”访问如下链接阅读原文:http://www.gii.upv.es/tlsf/files/ecrts04_tlsf.pdf。什么是TLSFTLSF是TwoLevelSegregatedFitmemoryal

    2022年6月30日
  • Vue 插槽之 作用域插槽「建议收藏」

    现在我有如下需求,子组件<user/>中此时有一条用户的信息(userInfo);我要在父组件通过插槽展示这个用户的姓名(userInfo.name);注意:这里的父组件并没有这个用户的信息,子组件中有,如果直接在父组件{{userInfo.name}}获取这条信息是获取不到的;因为,只有<user/>组件可以访问到userInfo,而我们提供的内容是在父…

    2022年4月13日
  • 软件使用&vmware虚拟机的安装步骤详细[通俗易懂]

    实验环境:Windows+Vmware12+RHEL7.2+Xshell5准备工作:1.关闭并退出360,电脑管家等优化软件,防止虚拟机运行出现问题。2.打开链接http://www.vmware.com/cn/products/workstation/workstation-evaluation下载试用版3.安装该软件,可以指定将来虚拟机存放的目录,其他随意。打开vmwar…

    2022年4月12日
  • 一窥直播技术新趋势「建议收藏」

    一窥直播技术新趋势「建议收藏」历经2016直播元年的爆发,直播App的虚火逐步降温,行业逐渐恢复理性,并不断探索新的产品形态与创新。这其中,技术扮演了不可或缺的角色,新的编码与传输协议,覆盖全球的网络架构,低延迟的音频传输与白板,基于深度学习的图像识别等,这一切进一步加强了各直播参与方的互动。基于Html5的直播技术,AR/VR,H.265编码普及,高清直播成本进一步降低,人工智能等技术又将让直播充满了更多想象。

    2022年7月21日

发表回复

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

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