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(0, 0, 60);
using (TransactionScope scope
{
try
{
//在這裡實現事務性工作
//傳送訊息
insertMessage(sendUserId, toUser, content, sendedStatus);
//在接收資訊表中插入記錄
receiveCount += insertReceiveMessage(userids[
// 沒有錯誤,提交事務
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
using
(TransactionScope tsCope= new TransactionScope())
{
using
(SqlConnection cn2005= new SqlConnection(someSql2005))
{
SqlCommand
cmd= new SqlCommand(sqlUpdate, cn2005);
cn2005.Open();
cmd.ExecuteNonQuery();
}
using
(SqlConnection cn2005= new SqlConnection(anotherSql2005))
{
SqlCommand
cmd= new SqlCommand(sqlDelete, cn2005);
cn2005.Open();
cmd.ExecuteNonQuery();
}
tsCope.Complete();
}
相關推薦
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
logstash將兩個field合併成一個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
delphi將兩個Strlist合並,求交集 (保留相同的)
dex str then eat ring integer for phi add Function StrList_Join(StrListA,StrListB:String):String; //將兩個Strlist合並,求交集 (保留相同的) var SList