標籤:tom 工作 blog service str 讀書 pen 筆記 lin
(一)簡介
事務的主要特徵是,任務要麼全部完成,要麼都不完成。
(二)概述
事務由交易管理員來管理和協調。每個影響事務結果的資源都由一個資源管理員來管理。交易管理員與資源管理員通訊,以定義事務的結果。
1、交易處理階段
啟用階段:在這個階段建立事務。
準備階段:在這個階段,每個資源管理員都可以定義事務的結果。
提交階段:當所有的資源管理員都成功準備好了,就開始這個階段。
2、ACID屬性
事務的特徵可以用術語ACID來定義:
Atomicity(原子性):表示一個工作單元。
Consistency(一致性):事務開始前的裝態和事務完成後的狀態必須有效。
Isolation(隔離性):表示並發進行的事務獨立於狀態,而狀態在交易處理過程中可能發生變化。
Durability(持久性):在事務完成後,它必須以可持久的方式儲存起來。
Ps:並不是每個事務都需要這4個屬性(例:記憶體的事務不需要持久性)。
(三)傳統的事務
1、ADO.NET事務
public async Task AddCourseAsync(string connectionStr, string sql){ var connection = new SqlConnection(connectionStr); SqlCommand courseCommand = connection.CreateCommand(); courseCommand.CommandText = sql; await connection.OpenAsync(); SqlTransaction tx = connection.BeginTransaction(); try { courseCommand.Transaction = tx; await courseCommand.ExecuteNonQueryAsync(); tx.Commit(); } catch (Exception ex) { Console.WriteLine("Error:" + ex.Message); tx.Rollback(); throw; } finally { connection.Close(); }}
2、System.EnterpriseServices
通過System.EnterpriseServices使用事務的優點是,不需要顯式地進行交易處理,運行庫會自動建立事務,只需要給有交易處理要求的類添加[Transaction]特性即可。[AutoComplete]特性把方法標記為自動化佈建事務的狀態位:如果該方法成功,就設定成功位,因此可以提交事務。如果發生異常,就終止事務。
[Transaction(TransactionOption.Required)]public class CourseData: ServicedComponent{ [AutoComplete] public async Task AddCourseAsync(string connectionStr, string sql) { var connection = new SqlConnection(connectionStr); SqlCommand courseCommand = connection.CreateCommand(); courseCommand.CommandText = sql; connection.Open(); try { courseCommand.ExecuteNonQuery(); } finally { connection.Close(); } }}
用System.EnterpriseServices建立事務的一大優點是,多個對象能輕鬆地運行在同一個事務中,事務還可以自動登記。缺點是它需要COM+主機模型,使用這個技術的類必須派生自基類ServicedComponent。
事務參考:http://www.cnblogs.com/leslies2/archive/2012/01/05/2289106.html
【讀書筆記】C#進階編程 第二十五章 交易處理