1. 程式人生 > >TransactionScope分散式事務,將兩個資料庫操作放在一個事務中

TransactionScope分散式事務,將兩個資料庫操作放在一個事務中

一、概念

1、在專案中引用using System.Transactions名稱空間(先要在新增net元件的引用);

TransactionScope有三種模式:

TransactionScopeOptions

描述

Required

如果已經存在一個事務,那麼這個事務範圍將加入已有的事務。否則,它將建立自己的事務。

RequiresNew

這個事務範圍將建立自己的事務。

Suppress

如果處於當前活動事務範圍內,那麼這個事務範圍既不會加入氛圍事務 (ambient transaction),也不會建立自己的事務。當部分程式碼需要留在事務外部時,可以使用該選項。


進入和退出事務都要快,這一點非常重要,因為事務會鎖定寶貴的資源。最佳實踐要求我們在需要使用事務之前再去建立它,在需要對其執行命令前迅速開啟連線, 執行動作查詢 (Action Query),並儘可能快地完成和釋放事務。在事務執行期間,您還應該避免執行任何不必要的、與資料庫無關的程式碼,這能夠防止資源被毫無疑義地鎖定過長的 時間。


2、程式碼例子:

 TransactionOptions transactionOption =new TransactionOptions();

            
//設定事務隔離級別

            transactionOption.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;

            
// 設定事務超時時間為60秒

            transactionOption.Timeout =new TimeSpan(0060);

            
using (TransactionScope scope 

=new TransactionScope(TransactionScopeOption.Required, transactionOption))
            
{
                
try

                
{
                    
//
在這裡實現事務性工作
     
//傳送訊息

                    insertMessage(sendUserId, toUser, content, sendedStatus);

     
//在接收資訊表中插入記錄

                    receiveCount += insertReceiveMessage(userids[
0], sendUserId, content, "0"
);
                   
                    
// 沒有錯誤,提交事務

                    scope.Complete();
                }

                
catch (Exception ex) {
                    
thrownew Exception("傳送資訊異常,原因:"+
ex.Message);
                }finally{
                    //釋放資源
                    scope.Dispose();
                  }
                               
            }

3、在TransactionScope中預設的事務級別是Serializable,即在事務過程中,完全性鎖表。別的程序不能查詢,修改,新增,刪除。這樣會導致效率大大降低,雖然資料完整性很高。通常我們不需要那麼高的資料完整性。所以需要修改預設的事務級別:

      所有的事務級別如下:

成員名稱 說明 
 Chaos                         無法改寫隔離級別更高的事務中的掛起的更改。  
 ReadCommitted       不可以在事務期間讀取可變資料,但是可以修改它。  
 ReadUncommitted    可以在事務期間讀取和修改可變資料。  
 RepeatableRead       可以在事務期間讀取可變資料,但是不可以修改。可以在事務期間新增新資料。  
 Serializable                可以在事務期間讀取可變資料,但是不可以修改,也不可以新增任何新資料。  
 Snapshot                   可以讀取可變資料。在事務修改資料之前,它驗證在它最初讀取資料之後另一個事務是否更改過這些資料。如果資料已被更新,則會引發錯誤。這樣使事務可獲取先前提交的資料值。 
在嘗試提升以此隔離級別建立的事務時,將引發一個 InvalidOperationException,併產生錯誤資訊“Transactions with IsolationLevel Snapshot cannot be promoted”(無法提升具有 IsolationLevel 快照的事務)。
 
 Unspecified                正在使用與指定隔離級別不同的隔離級別,但是無法確定該級別。如果設定了此值,則會引發異常。  

二、與資料庫事務結合

//建立TransactionScope
wps_clip_image-8386using (TransactionScope tsCope= new TransactionScope())
wps_clip_image-10230wps_clip_image-16703{
wps_clip_image-12198 using (SqlConnection cn2005= new SqlConnection(someSql2005))
wps_clip_image-8414wps_clip_image-5728 {
wps_clip_image-7947 SqlCommand cmd= new SqlCommand(sqlUpdate, cn2005);
wps_clip_image-15199 cn2005.Open();
wps_clip_image-11670 cmd.ExecuteNonQuery();
wps_clip_image-716 }
wps_clip_image-15176 using (SqlConnection cn2005= new SqlConnection(anotherSql2005))
wps_clip_image-30312wps_clip_image-12410 {
wps_clip_image-13405 SqlCommand cmd= new SqlCommand(sqlDelete, cn2005);
wps_clip_image-29978 cn2005.Open();
wps_clip_image-26021 cmd.ExecuteNonQuery();
wps_clip_image-29682 }
wps_clip_image-175
wps_clip_image-27966 tsCope.Complete();
wps_clip_image-554}

相關推薦

TransactionScope分散式事務資料庫操作放在一個事務

一、概念 1、在專案中引用using System.Transactions名稱空間(先要在新增net元件的引用); TransactionScope有三種模式: TransactionScopeOptions 描述 Required 如果已經存在一個事務,那麼這個事務範

帶頭結點的連結串列La,Lb連結串列合併到La並且不破壞Lb的結構

#include<stdio.h>#include<malloc.h> typedef struct LNode{ int data; struct LNode *next;}LNode,*LinkList; void CreateList(LinkList &L,int

用IO流的知識檔案寫到一個檔案(設定字元編碼)

1、把a.txt文字檔案(gbk)和b.ttt文字檔案(utf-8)的內容讀取出來,把a.txt內容加b.ttt內容一起寫到c.txt檔案(gbk),先寫a再寫b。 public class Tes

合並排序已經排序的數組合並成一個數組

n) ring 一個數 合並排序 sizeof 並排 names 排序 name #include<iostream> #include<string.h> using namespace std; void MergeArray(int a[]

給定變數的值 值的內容交換

define _CRT_SECURE_NO_WARNINGS include<stdio.h> include<stdlib.h> int main(){ int a=1; int b=2; int c; c = a; a = b; b = c; prin

給定整形變數的值值得內容交換

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //方法一;定義另外一個變數,通過該變數交換兩個數的內容 //int main() //{ // int a = 0; // int b = 0; // int t = 0; //

C語言:給定整形變數的值值的內容進行交換

給定兩個整形變數的值,將兩個值的內容進行交換,有三種不同的方法。第一種:定義一個中間變數,使得兩個數值交換。第二種:利用兩個數值之間相互加減,使得兩個數值交換。第三種:利用異或運算,使得兩個數值交換。第一種方法程式碼如下: #include<stdio.h> int main() {

給定整型變數的值值的內容進行交換

#include <stdio.h> #include<stdlib.h> void main() { int num; int a = 10; int b = 20; num = a; a = b; b = num; printf("a=%d\n", a);

給定整型變數的值值得內容進行交換。

1.利用新的變數進行替換,程式碼如下: int main() { int a = 10; int b = 90; int tmp = 0; tmp = a; a = b; b = tmp; printf("%d %d", a, b);

1.給定整形變數的值值的內容進行交換2.不允許建立臨時變數交換個數的內容

1.給定兩個整形變數的值,將兩個值的內容進行交換 #include<stdio.h> int main() { int i = 0; int j = 0; int temp = 0; scanf("%d %d",&i,&j); tem

【C語言】給定整型變數的值值的內容進行交換(不同方法)

     給定兩個整型變數的值,將兩個值的內容進行交換,現在我介紹幾種不同的實現方法:法1:在主函式裡實現,這樣操作這兩個值時並未重新開闢空間,直接交換可以達到目的。#include<stdio.h> #include<stdlib.h> int m

Python練習題8(替換相同的字符串並輸出):輸入字母串字母串都包含的字母用'_'替換後輸出字母串的剩余部分 (不能為空串區別大小寫只能包含字母)

format pre 兩個 div form tput nco encode col 方法一:檢查輸入是否為空串,循環字母串,相同的則替換,然後再用replace()方法去除,輸出想要的結果 1 def str_replace(messages1,messages2):

Python練習題8(替換相同的字串並輸出):輸入字母串字母串都包含的字母用'_'替換後輸出字母串的剩餘部分 (不能為空串區別大小寫只能包含字母)

方法一:檢查輸入是否為空串,迴圈字母串,相同的則替換,然後再用replace()方法去除,輸出想要的結果 1 def str_replace(messages1,messages2): 2 if messages1.strip() == '' or messages2.strip() ==

第十五週oj訓練——寫一函式字串連線(1052)

問題及程式碼Description寫一函式,將兩個字串連線Input兩行字串Output連結後的字串Sample Input123 abcSample Output123abc解法一:用函式/*煙臺大學計算機與控制工程學院 2016 作者: 馬春澎 完成日期:2016年12月

在python如何list合併成一個list不用for語句

除了直接相加(生成新的list),還有兩種方法(修改其中一個list): 用list的extend方法,L1.extend(L2),該方法將引數L2的全部元素新增到L1的尾部,例如: 1 2 3 4 5 >>> L1 = [1, 2, 3, 4, 5] >

編寫一個函式字串連線起來。(不能用strcat函式)。

編寫一個函式,將兩個字串連線起來。(不能用strcat函式)。 #include <stdio.h> #include <string.h> char* stringcat(char* strDest , const char*strSrc) {  

List合併為一個List(並集)+取交集

並集 List<Integer> questionerIdList = new ArrayList<Integer>(); List l1 = sysuserinfMapper

logstashfield合併成一個field方法

今天格式化一個日誌,日期不好取,分成了兩個欄位。後來date又支援一個欄位date {      match => ["time", "yyyy-MM-dd HH:mm:ss.SSS" ]   

excel檔案合成一個檔案的多sheets

此處是以Excel2007為基礎1)新建一個空白的excel檔案2)選中巨集,跳出如下視窗,在巨集名下隨便命名,點選建立…3)將下列程式碼貼上至建立後跳出的兩行程式碼之間,啥都不用改,除了……如果excel格式是xls,把xlsx改成xls即可Dim FileOpenDim 

delphiStrlist合並求交集 (保留相同的)

dex str then eat ring integer for phi add Function StrList_Join(StrListA,StrListB:String):String; //將兩個Strlist合並,求交集 (保留相同的) var SList