C 筆記17 事務

2021-06-28 22:10:35 字數 2915 閱讀 4369

c#筆記17:事務

本章概要:

1:事務概述

2:隱式事務

3:顯示事務

1:事務概述

當您從網上書店購買書籍時,會用錢(以信貸方式)來交換書籍。如果您的信用良好,則一系列相關操作可確保您和書店可以相應地獲得書籍和錢。但如果在交換期間該系列操作中的單個操作發生故障,則整個交換就會失敗。結果,您就得不到書籍,而書店也得不到錢。負責使該交換取得平衡且可**的技術稱為事務處理。

事務操作可限定於單個資料資源,如資料庫或訊息佇列。在這種情況下,本地事務由 system.transactions 所提供的可提公升效能的事務管理器管理。當這些事務由資料資源控制時,它們具有高效性並易於管理。 

事務也可跨多個資料資源。使用分布式事務可以將在不同系統上執行的多種不同的操作合併到乙個通過或失敗的操作中。在這種情況下,事務由位於每個系統中的 microsoft 分布式事務協調器 (msdtc) 進行協調。

事務也可以有多個參與者。

可使用 ado.net、system.enterpriseservices 或 system.transactions 命名空間所提供的新事務性程式設計模型來建立事務。

system.transactions 命名空間中的類所提供的基礎結構通過支援在 sql server、ado.net、訊息佇列 (msmq) 和 microsoft 分布式事務協調器 (msdtc) 中啟動的事務,使事務程式設計變得簡單和高效。

system.transactions 命名空間提供基於 transaction 類的顯式程式設計模型和使用 transactionscope 類的隱式程式設計模型,在後一種模型中,事務由該基礎結構自動管理。此外,system.transactions 命名空間還提供了用於實現資源管理器的型別。資源管理器管理事務中使用的持久或可變資料,並與事務管理器協調工作,共同為應用程式提供了原子性和隔離性的保證。由 system.transactions 基礎結構提供的事務管理器支援的事務可涉及到多個可變資源或單個持久資源。

2:隱式事務

可採用 transaction 類來利用顯式程式設計模型,也可採用 transactionscope 類來利用隱式程式設計模型(其中的事務將由基礎結構自動管理)。建議您使用隱式事務模型進行開發。

建立新的 transactionscope 物件後即會啟動事務範圍。建議您使用 using 語句建立範圍,如該**示例中所示。

void rootmethod()

}void somemethod()

}

最頂層事務範圍稱為根範圍。

transactionscope 的有些過載建構函式接受 timespan 型別的值,該值用於控制事務的超時。超時設定為零時表示超時無限長。無限長的超時主要對除錯有用,除錯過程中可能要經由逐句通過**來隔離業務邏輯中的問題,並且在嘗試確定問題期間不希望所除錯的事務超時。在所有其他情況下使用無限長的超時時一定要格外小心,因為它會覆蓋防止事務死鎖的保護。

3:顯示事務

committabletransaction 類為應用程式使用事務提供了一種顯式方法,而不是隱式地使用 transactionscope 類。對於要跨多個函式呼叫或多個執行緒呼叫使用同一事務的應用程式,十分有用。transactionscope 類不同,應用程式編寫器需要明確呼叫 commit 和 rollback 方法以提交或中止事務。

//create a committable transaction

tx = new committabletransaction();

sqlconnection myconnection = new sqlconnection("server=(local)\\sqlexpress;integrated security=sspi;database=northwind");

sqlcommand mycommand = new sqlcommand();

//open the sql connection

myconnection.open();

//give the transaction to sql to enlist with

myconnection.enlisttransaction(tx);

mycommand.connection = myconnection;

// restore database to near it's original condition so sample will work correctly.

mycommand.commandtext = "delete from region where (regionid = 100) or (regionid = 101)";

mycommand.executenonquery();

// insert the first record.

mycommand.commandtext = "insert into region (regionid, regiondescription) values (100, 'midwestern')";

mycommand.executenonquery();

// insert the second record.

mycommand.commandtext = "insert into region (regionid, regiondescription) values (101, 'mideastern')";

mycommand.executenonquery();

// commit or rollback the transaction

while (true)

else

if ((c.keychar == 'r') || (c.keychar == 'r'))

}myconnection.close();

tx = null;

c 學習筆記(17)

類模板中的成員函式建立時機 類模板中成員函式和普通類中成員函式建立時機是有區別的 普通類中的成員函式一開始就可以建立 類模板中的成員函式在呼叫時才建立 template class t class myclass void func2 因為在呼叫之前,無法確定obj的資料型別,所以成員函式不會被建立...

C 學習筆記17 繼承

繼承 物件導向中的繼承指類之間的父子關係 子類擁有父類的所有成員變數和成員函式 子類就是一種特殊的父類 子類物件可以當作父類物件使用 子類可以擁有父類沒有的方法和屬性 繼承時候的訪問級別設定會影響到成員的訪問級別 class child parent 等價於class child private p...

C 學習筆記 (17)繼承

類的繼承或類的派生 把類按照其之間的關係組成的層次結構,稱之為類的繼承或類的派生。基類和派生類 水果是一種基類,桃 梨 蘋果是派生類 派生類可以繼承基類裡的屬性 欄位和方法,然後加上自己特殊的屬性 欄位和方法。派生的語法格式 類修飾符 class 派生類名 基類名 訪問控制問題public 都可以訪...