設定交易
交易屬性是一種宣告式屬性,可自動管理元件開發人員的交易。 藉由設定這個屬性,您就不需要在元件中使用明確的交易控件。
COM+ 會使用元件的交易屬性來判斷它所啟動之每個物件所需的交易保護類型。 視其需求而定,物件可以共用其呼叫端的交易、需要新的交易,或在沒有交易保護的情況下運作。
COM+ 提供下列交易屬性值:
-
禁用
-
一般而言,只有在您確定元件永遠不會存取資源管理員時,才應該設定這個屬性值。 當您停用交易屬性時,COM+ 會忽略元件在判斷物件內容放置方面的交易需求。 因此,物件可以共用其呼叫端的內容(和交易)。 將 COM 元件移轉至 COM+ 時,您必須停用交易屬性,以維持與未設定 COM 元件相同的交易行為。
注意
未設定的元件是 COM+ 應用程式中尚未安裝的 COM 元件。
-
不支援
-
當您設定這個屬性值時,COM+ 可確保從元件建立的任何物件都不會參與交易,而不論其呼叫端的交易狀態為何。 藉由宣告此值,您可確保物件不會在其呼叫端的交易中投票,也無法開始自己的交易。 [不支援] 是所有元件的預設值。
-
支援
-
當您設定這個屬性值時,COM+ 可確保從元件建立的任何物件如果存在,就會參與交易。 當您想要物件在其呼叫端的交易中共用,而不需要自己的交易時,您會宣告此值。
-
必填
-
當您設定這個屬性值時,COM+ 可確保從元件建立的任何物件都是交易式的。 當 COM+ 啟動具有必要設定的物件時,它會查看其呼叫端的交易狀態。 如果呼叫端有交易,新的物件就會包含在目前的交易中。 否則,COM+ 會開始交易,使新對象成為交易的根目錄。 這是執行資源活動的元件慣用設定,因為它有助於為這些活動提供交易保護。
-
需要新的
-
當您設定這個屬性值時,COM+ 可確保從元件建立的任何對象都必須參與新交易做為交易的根目錄,而不論呼叫端的交易狀態為何。 COM+ 會自動起始與呼叫端異動的新交易。
注意
COM+ 不支援巢狀交易。 當某個交易物件呼叫另一個標記為 「需要新」的元件時,COM+ 會為新啟動的物件建立獨立的交易界限。 除非第一筆交易明確記下第二筆交易的結果,並根據這些結果修改其投票,否則第二筆交易不會影響第一筆交易。
交易屬性相依性
下表顯示每個 COM+ 交易屬性值的特性,包括值對交易特性的影響。 COM+ 會 針對所有交易元件強制執行 JIT 啟用 和 同步 處理。
屬性值 | 新增交易 | 用戶端的交易 | 交易根目錄 | JIT 啟用 | 同步處理 |
---|---|---|---|---|---|
停用 |
永不 |
可能 |
永不 |
選擇性 |
選擇性 |
不支援 |
永不 |
永不 |
永不 |
選擇性 |
選擇性 |
支援 |
永不 |
如果用戶端有交易 |
永不 |
必要 |
必要 |
必要 |
可能 |
如果用戶端有交易 |
如果客戶端沒有交易 |
必要 |
必要 |
必須是新交易 |
永遠 |
永不 |
永遠 |
必要 |
必要 |
交易界限
交易有一個開頭、一個結束,而且只會發生一次。 在其執行期間,交易可能會呼叫資源,例如資料庫或佇列,以完成一或多個工作。 每個資源都落在交易界限內。 交易界限內的所有資源,可以跨越多個進程和計算機界限,共用單一交易。 管理這些程式與計算機界限之間的一致性非常重要。
COM+ 會根據您為每個元件設定的交易屬性值,自動管理交易界限,以確保一致性。 COM+ 交易會自動流向指示參與交易的物件,並略過指示在交易外部執行的物件。 COM+ 不支援巢狀交易。 相反地,COM+ 交易是相異且短期的。
交易界限中的第一個物件對交易特別,而且稱為 交易的根物件 。 交易中只能有一個根物件。 根物件下交易式階層中的所有其他對象稱為 內部物件。
對應交易
若要確保物件包含在正確的交易界限中,其中一個方法是在開始撰寫元件之前,先對應交易。 藉由對應交易,您可以決定您所撰寫之每個元件的最佳設定。 您對於元件使用方式越確定,越容易選取正確的交易屬性值。
在運行時間,COM+ 會查看交易屬性,以判斷物件是否應該是新交易的根目錄、在現有的交易中建立,或建立為非交易物件。
下圖顯示可能的異動對應。 在圖例中,用戶端會建立需要交易的物件 1。 因為沒有任何交易存在,COM+ 會建立 Transaction 1,並將 Object 1 放在其中做為根物件。 物件 1 會建立物件 2,其支援交易,因此會放在交易 1 中。 物件 2 會建立物件 3,其不支援交易,因此會置於所有交易之外。 物件 2 也會建立物件 4,這需要交易,因此會放在交易 1 中。 物件 3 會建立支援交易的物件 5。 不過,由於物件 5 是由不存在於交易中的物件所建立,因此也會放在所有交易之外。 物件 4 會建立物件 6,這需要新的交易,因此 COM+ 會建立交易 2,並將物件 6 放在其中做為根物件。 物件 6 會建立物件 7,其支援交易,因此會放在交易 2 中。
上圖顯示兩個潛在的問題區域。 首先,大部分的工作都是在兩個不同的交易之間分割。 如果交易 1 在物件 4 建立物件 6 之後失敗,則交易 2 會不受交易 1 的結果影響。 如果這是非預期的結果,您可能會偏好將這兩筆交易的作業折疊成單一交易,您可以將 Object 6 的交易屬性變更為 [必要] 來完成。
對應圖也顯示物件 3 和物件 5 是非交易式,完全超出交易 1 和 2 的範圍。 如果物件 5 更新持續性數據,您可能會想要重新考慮其非交易狀態。 物件 5 可以藉由將其交易屬性變更為 Required,將它放在交易中。