TransactionScope 的基本原理简介

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数据库 需要驱动支持。

 

以下来自MSDN:

System.Transactions 基础结构提供了这两个的显式编程模型基于 Transaction 类,以及隐式编程模型使用 TransactionScope 类,在其中事务自动管理基础结构。

System_CAPS_important重要事项

建议您创建使用隐式事务 TransactionScope 类,以便为您自动管理环境事务上下文。 您还应该使用 TransactionScope 和 DependentTransaction 跨多个函数调用或多个线程调用需要使用相同的事务的应用程序的类。 此模型的详细信息,请参阅 Implementing An Implicit Transaction Using Transaction Scope 主题。 编写事务应用程序的详细信息,请参阅 Writing A Transactional Application。

 

在实例化 TransactionScope 通过 new 语句中,事务管理器确定哪些事务参与进来。 一旦确定,该范围将始终参与该事务。 此决策基于两个因素:是否存在环境事务以及构造函数中 TransactionScopeOption 参数的值。 环境事务是在代码中执行的事务。 可通过调用 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://www.cnblogs.com/micro-chen/p/7725102.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Canvas 生成交互动画

2019独角兽企业重金招聘Python工程师标准>>> 今天介绍的是一个HTML5交互动画效果,难以置信。HTML5虽说还有很多东西在改进,但现在所能实现的 效果的程度我想是诸位很难想象得到的,实在是发展得太快了。 查看详情 转载于:https://m…

二分搜索技术

2019独角兽企业重金招聘Python工程师标准>>> 分治法的基本思想:将一个规模为n的问题,分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归的解这些子问题,然后将各个子问题的解合并得到原问题的解。 经…

apachacxf项目使用@WebService报错

首先去除已经导入的包那是因为我们要导入javaee的api,首先点击最下面这个选择自己电脑上的路径然后就会自动导入上面的包,同时在jar库上也会出现转载于:https://www.cnblogs.com/fengnan/p/9311949.html

Java中的属性和方法

题目 实体类 测试类 转载于:https://www.cnblogs.com/maoxiuying/p/9130361.html

2019-06-13 Java学习日记之MySql

数据库概述: 1、什么是数据库,数据库有什么作用? 数据库就是存储数据的仓库,气本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及…

windows下手动安装composer

1.下载compser.phar 地址 https://getcomposer.org/download/ 2.新建composer.bat 文件,写入“php "%~dp0composer.phar" %*” 3.把composer.bat composer.phar 两个文件放入 4.向环境变量里面写人“;D:\phpStudy\php\php-5.4.45;D:\phpStudy\php\php-5…

java-number

通常,当我使用number类型的时候,我们可以使用原始数据类型例如byte,int,long,double等 int i 5000; float b 13.65; double m 0xaf; 所有包装类(整型,长型,字节型,双精度型,浮点型&a…

MyBatis学习总结(9)——使用MyBatis Generator自动创建代码

2019独角兽企业重金招聘Python工程师标准>>> 由于MyBatis属于一种半自动的ORM框架,所以主要的工作就是配置Mapping映射文件,但是由于手写映射文件很容易出错,所以可利用MyBatis生成器自动生成实体类、DAO接口和Mapping映射文件。这…

20162317 2017-2018-1 《程序设计与数据结构》第8周学习总结

20162317 2017-2018-1 《程序设计与数据结构》第8周学习总结 教材学习内容总结 1、二叉查找树的定义、性质2、向二叉查找树中添加元素的方法3、在二叉查找树中删除元素的方法4、旋转的定义、方法、意义 教材学习中的问题和解决过程问题1:我在17章中看到这么一句话&a…

Java基础学习总结(22)——异常处理

2019独角兽企业重金招聘Python工程师标准>>> 一、异常的概念 异常指的是运行期出现的错误,也就是当程序开始执行以后执行期出现的错误。出现错误时观察错误的名字和行号最为重要。 1 package cn.javastudy.summary;2 3 public class TestEx{4 5 …

130242014045 林承晖 第2次实验

软件体系结构的第二次实验(解释器风格与管道过滤器风格) 一、实验目的 1.熟悉体系结构的风格的概念 2.理解和应用管道过滤器型的风格。 3、理解解释器的原理 4、理解编译器模型 二、实验环境 硬件: 软件:P…

Java基础学习总结(8)——super关键字

2019独角兽企业重金招聘Python工程师标准>>> 一、super关键字 在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类…

Java基础学习总结(17)——线程

2019独角兽企业重金招聘Python工程师标准>>> 一、线程的基本概念 线程理解:线程是一个程序里面不同的执行路径 每一个分支都叫做一个线程,main()叫做主分支,也叫主线程。 程只是一个静态的概念,机器上的一个.class文件…

(转)MySQL自带的性能压力测试工具mysqlslap详解

mysqlslap 是 Mysql 自带的压力测试工具,可以模拟出大量客户端同时操作数据库的情况,通过结果信息来了解数据库的性能状况 mysqlslap 的一个主要工作场景就是对数据库服务器做基准测试 例如我们拿到了一台服务器,准备做为数据库服务器&#x…

node.js HelloWord

创建 server.js var http require("http"); http.createServer(function(req,res){ //设置请求头的编码格式 res.writeHead(200,{Content-Type:text/html;charsetutf-8}); //设置网页的编码格式&#xff08;防止中文乱码&#xff09; res.write("<head>&…

架构师不可不知的十大可扩展架构

2019独角兽企业重金招聘Python工程师标准>>> 可扩展性正是如今软件设计领域最值得优先考虑的要素。然而&#xff0c;计算机科学家们还无法了解一套单独的架构如何才能扩展至各类应用环境当中。相反&#xff0c;我们在数量繁多的方案中所设计出的可扩展性架构&#x…

Winform开发框架中工作流模块的业务表单开发

在我们开发工作流的时候&#xff0c;往往需要设计到具体业务表单信息的编辑&#xff0c;有些是采用动态编辑的&#xff0c;有些则是在开发过程中处理的&#xff0c;各有各的优点&#xff0c;动态编辑的则方便维护各种各样的表单&#xff0c;但是数据的绑定及处理则比较麻烦&…

RabbitMQ学习总结(2)——安装、配置与监控

2019独角兽企业重金招聘Python工程师标准>>> 一、安装 1、安装Erlang 1&#xff09;系统编译环境&#xff08;这里采用linux/unix 环境&#xff09; ① 安装环境 虚拟机&#xff1a;VMware Workstation 10.0.1 build Linux系统&#xff1a;CentOS6.5 rabbitMQ官网下…

CODE[VS] 3411 洪水

题目描述 Description小浣熊松松和朋友到野外露营&#xff0c;没想到遇上了&pi;年一次的大洪水&#xff0c;好在松松是一只爱观察的小浣熊&#xff0c;他发现露营地的地形和洪水有如下性质&#xff1a; ①露营地可以被看做是一个N*M的矩形方阵&#xff0c;其中左上角坐标为…

Solr管理页面 上

DashBoard&#xff08;仪表盘&#xff09;Logging&#xff08;日志&#xff09;Core Admin&#xff08;Core管理&#xff09;在Solr中&#xff0c;每一个Core&#xff0c;代表一个索引库&#xff0c;里面包含索引数据及其配置信息。Solr中可以拥有多个Core&#xff0c;也就同时…