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.pswp.cn/news/251652.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251652.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251652.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Canvas 生成交互動畫

2019獨角獸企業重金招聘Python工程師標準>>> 今天介紹的是一個HTML5交互動畫效果,難以置信。HTML5雖說還有很多東西在改進,但現在所能實現的 效果的程度我想是諸位很難想象得到的,實在是發展得太快了。 查看詳情 轉載于:https://m…

Spark記錄-Scala數據類型

Scala與Java具有相同的數據類型,具有相同的內存占用和精度。以下是提供Scala中可用的所有數據類型的詳細信息的表格: 序號數據類型說明1Byte8位有符號值,范圍從-128至1272Short16位有符號值,范圍從-32768至327673Int32位有符號值&…

二分搜索技術

2019獨角獸企業重金招聘Python工程師標準>>> 分治法的基本思想:將一個規模為n的問題,分解為k個規模較小的子問題,這些子問題互相獨立且與原問題相同。遞歸的解這些子問題,然后將各個子問題的解合并得到原問題的解。 經…

數據庫連接情況查詢

--sp_who 可以指定數據庫名,查詢指定數據庫的連接情況 sp_who go select DB_NAME(database_id) dbname, login_name, t1.session_id, t1.request_id, t2.status, t1.start_time, host_name from sys.dm_exec_requests t1inner join sys.dm_exec_sessions t2 on…

apachacxf項目使用@WebService報錯

首先去除已經導入的包那是因為我們要導入javaee的api,首先點擊最下面這個選擇自己電腦上的路徑然后就會自動導入上面的包,同時在jar庫上也會出現轉載于:https://www.cnblogs.com/fengnan/p/9311949.html

windows下redis 開機自啟動

1,在redis的目錄下執行(執行后就作為windows服務了)redis-server --service-install redis.windows.conf 2,安裝好后需要手動啟動redisredis-server --service-start 3,停止服務redis-server --service-stop 4&#xf…

Java中的屬性和方法

題目 實體類 測試類 轉載于:https://www.cnblogs.com/maoxiuying/p/9130361.html

《JavaScript》高級程序設計---第3章

3.基本概念 松散類型:所謂松散類型就是可以用來保存任何類型的數據。給未經聲明的變量賦值在嚴格模式下會導致拋出ReferenceError錯誤。Object本質上由一組無序的名值對組成。未經初始化的默認值就會取得undefined值。True和False都不是Boolean值,只是標識符。如果…

2019-06-13 Java學習日記之MySql

數據庫概述: 1、什么是數據庫,數據庫有什么作用? 數據庫就是存儲數據的倉庫,氣本質是一個文件系統,數據按照特定的格式將數據存儲起來,用戶可以對數據庫中的數據進行增加,修改,刪除及…

jquery 文件預覽功能

$(function() {$("#pic").click(function () {$("#upload").click(); //隱藏了input:file樣式后,點擊頭像就可以本地上傳$("#upload").on("change",function(){var objUrl getObjectURL(this.files[0]) ; //獲取圖片的路徑…

筆試小結---線程、進程

多進程:進程是資源分配的基本單位,它是程序執行時的一個實例。程序運行時,系統就會創建一個進程,并為它分配資源,然后把該進程放入進程就緒隊列,進程調度器選中它的時候就會為它分配CPU時間,程序開始真正運…

Spring security (一)架構框架-Component、Service、Filter分析

想要深入spring security的authentication (身份驗證)和access-control(訪問權限控制)工作流程,必須清楚spring security的主要技術點包括關鍵接口、類以及抽象類如何協同工作進行authentication 和access-control的實…

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…

寫更漂亮的javascript

用更合理的方式寫 JavaScript 目錄 聲明變量對象數組字符串函數箭頭函數模塊迭代器和生成器屬性變量提升比較運算符和等號代碼塊注釋空白逗號分號類型轉換命名規則聲明變量 1.1 使用let和const代替var 不會變的聲明用const//bad var $cat $(.cat)//good const $cat $(.cat)…

筆試小結---樹

平衡二叉樹(Balanced Binary Tree):又被稱為AVL樹,且具有以下性質:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,并且左右兩個子樹都是一棵平衡二叉樹。 二叉搜索樹:是一顆二叉樹,可能為空;若非空,則滿足以下特征: 1.每個元素有一…

iOS 快速實現分頁界面的搭建

級別: ★★☆☆☆ 標簽:「iOS」「分頁」「QiPageMenuView」 作者: 沐靈洛 審校: QiShare團隊 iOS 快速實現分頁界面的搭建 項目中我們經常會遇到滾動分頁的設計效果,被用來對不同數據界面的展示進行分類。我們先可以來…

java中String的常用方法

java中String的常用方法 轉自:http://archer-zhou.iteye.com/blog/443864 java中String的常用方法1、length() 字符串的長度例:char chars[]{a,b.c};String snew String(chars);int lens.length();2、charAt() 截取一個字符例:char ch;ch&quo…

筆試小結---非對稱加密算法

非對稱加密算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey).公開密鑰和私有密鑰是一對,如果公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰進行加密,那么只有用對應的公開密鑰才能解密. 非對稱加密算法的保密性比較好,它消除了最終用戶交換…

登錄令牌 Token 介紹

Token值介紹 token 值: 登錄令牌.利用 token 值來判斷用戶的登錄狀態.類似于 MD5 加密之后的長字符串. 用戶登錄成功之后,在后端(服務器端)會根據用戶信息生成一個唯一的值.這個值就是 token 值. 基本使用: 在服務器端(數據庫)會保存這個 token 值,以后利用這個 token 值來檢索…

java-number

通常,當我使用number類型的時候,我們可以使用原始數據類型例如byte,int,long,double等 int i 5000; float b 13.65; double m 0xaf; 所有包裝類(整型,長型,字節型,雙精度型,浮點型&a…