[修練營ASP.NET]COM+的交易(Transaction)讓商業層確保資料的完整性

承繼之前的【淺談多層式架構 (Multi Tiers)】與【透過COM+來變身(切換身分)執行】。我們這一篇要來講COM+中小喵覺得最精華的部分--COM+的【交易(Transaction)】支援。再分析系統後,我們可能會將各式各樣的商業邏輯寫成Function放在不同的Project裡面的Class中,並且會互相呼叫來完成要進行的商業邏輯。而在互相呼叫的過程中,就可能有必要將彼此包在一個Transaction中。我們這篇就是要來講不同的元件中的相互呼叫時,如何包起Transaction的各種方式。

緣起

承繼之前的【淺談多層式架構 (Multi Tiers)】與【透過COM+來變身(切換身分)執行】。我們這一篇要來講COM+中小喵覺得最精華的部分--COM+的【交易(Transaction)】支援。再分析系統後,我們可能會將各式各樣的商業邏輯寫成Function放在不同的Project裡面的Class中,並且會互相呼叫來完成要進行的商業邏輯。而在互相呼叫的過程中,就可能有必要將彼此包在一個Transaction中。我們這篇就是要來講不同的元件中的相互呼叫時,如何包起Transaction的各種方式。

 

何謂交易

再說明之前,先來看一下網路上的說明(Transaction ACID)

(資料引用自:http://www.probe.com.tw/Products/jlive_doc/transaction.html)

  • Atomicty 原子:不可部分完成性。如同原子一般,一個交易被視為最小的運作單位,不容許分割的完整個體,也就是說交易的處理只有成功執行或是不執行,沒有模糊地帶。

  • Consistency 一致:每個交易所造成的資料異動,必須滿足資料庫整體資料的一致性,否則將拒絕此異動作業,還原原始資料。

  • Isolation 隔離:隔離性,資料庫系統可以同時處理多個交易,每個交易之間應當具備循序能力(Serializability),所以當一個交易尚未完成時,所異動的資料是不可以被其他交易使用,以免不確定性的異動結果造成其他交易的不正確處理結果。

  • Durability 耐久:持續性,利用交易所處理的異動,在交易尚未結束前,不會變動原始資料,只有當交易完成後,才會將異動反映到資料庫。此時即使發生系統故障,也不會影響異動後的資料。

以上是蠻學術性的講法,交易簡單的說就是【全有或全無】,交易過程中,要就必須全部成立,否則就全部失敗,小喵舉個例子,假設元件A→(呼叫)元件B,這個過程被包在一個Transaction中,那麼

  1. 剛開始還沒執行前,資料A=0,資料B=0
  2. 元件A改變了某一個資料A=1
  3. 元件B可以看到A=1,交易外面則是看到資料A被鎖定無法讀取
  4. 此時元件B改變資料B=1,元件A也可以看到資料B=1,交易外面看資料A,B被鎖定,無法讀取
  5. 元件B更改資料C=1時發生問題→觸發SetAbort→復原異動資料
  6. 復原後A=0,B=0且外部可以查詢A=0,B=0

 

COM+的交易(Transaction)類型

COM+的異動是設定在類別上,該類別為什麼樣,這個類別中的所有Function都是依照該類別的設定來運作,而設定時是直接撰寫在類別的宣告上,而交易可以有四種,分別為:(對照到元件服務所看到的中文)

  • Disabled:停用
  • NotSupported:不支援
  • Supported:支援的
  • Required:必要
  • Requires New:需要新增

CPT002 CPT001

不同的設定,將會影響元件呼叫元件時,Transaction會如何包,如何運作。以下用來說明一下各個不同設定的意義:

 

元件呼叫元件的運作方式

在說明之前,以下會用一些圖形來代表Transaction運作的方式,先來看一下一些圖示的意義。方便理解接著的說明圖片。

 

CT001 CT002 CT003 CT004

 

接著來介紹各個不同設定的運作方式:

 

NotSupported(不支援)/Disabled(停用) : 無論呼叫他的元件是否有Transaction, 都不會有Transaction

CT005

 


Supported(支援的) : 依據呼叫的那個,前面無就無;前面有就有,而且會跟前面的包在一起。(支援前面的)

CT006

 

 


Required(必要) : 前面無,自己會產生一個;前面有,跟前面的包在一起。(最常用)

CT007

例如:A元件進行開立銷售傳票行程,此時呼叫B元件檢查庫存,並扣除可販數量,之後回到A元件,接著產生銷售傳票(Head/Detail)。這個過程是在不同的元件,卻完整包在一個Transaction中,全有或全無。中間過程有任何問題,會將全部過程Rollback。

 

 


 

Requires New(需要新增) : 無論前面有無,都會產生新的Transaction。(不會跟前面的包在一起)

CT008

例如:A元件接收批次訂單,產生了1000筆訂單,接著呼叫逐筆呼叫B元件,逐筆開立銷售傳票。產生訂單的A元件,與逐筆開立銷售傳票的B元件變成各自獨立的Transaction。如果是包成一個Transaction,那麼就變成必須這1000筆訂單都能成功出貨才能成立。但是訂單可以先成立,萬一開銷售傳票過程,遇到機種不足,該筆訂單不成功,卻可以繼續做下去,不影響1000筆訂單產生的過程。

 

 


透過以上圖片理解各種Transaction方式宣告的動作模式後。其實這些的Transaction動作只要宣告在Class上,那麼該Class就會依照這個宣告,在不同Class的Function呼叫時,就會依照這樣的方式運作。而撰寫商業邏輯時,需要考慮未來將需要怎麼運作,給予正確的宣告。

 


以下是簽名:


Microsoft MVP
Visual Studio and Development Technologies
(2005~2019/6) 
topcat
Blog:http://www.dotblogs.com.tw/topcat