交易屬性 是一種宣告式屬性,可自動管理元件開發人員的交易。 藉由設定這個屬性,您就不需要在元件中使用明確的交易控件。
COM+ 會使用元件的交易屬性來判斷它所啟動之每個物件所需的交易保護類型。 視其需求而定,物件可以共用其呼叫端的交易、需要新的交易,或在沒有交易保護的情況下運作。
COM+ 提供下列交易屬性值:
-
已停用
-
一般而言,只有在您確定元件永遠不會存取資源管理員時,才應該設定這個屬性值。 當您停用交易屬性時,COM+ 會忽略元件在判斷物件內容放置方面的交易需求。 因此,物件可以共用其呼叫端的內容(和交易)。 將 COM 元件移轉至 COM+ 時,您必須停用交易屬性,以維持與未設定 COM 元件相同的交易行為。
注意
未設定的元件 是尚未安裝在 COM+ 應用程式中的 COM 元件。
-
不支援
-
當您設定這個屬性值時,COM+ 可確保從元件建立的任何物件都不會參與交易,而不論其呼叫端的交易狀態為何。 藉由宣告此值,您可確保物件不會在其呼叫端的交易中投票,也無法開始自己的交易。 [不支援] 是所有元件的預設值。
-
支援:
-
當您設定這個屬性值時,COM+ 可確保從元件建立的任何物件如果存在,就會參與交易。 當您希望物件共用其呼叫者的交易而不需要自己的交易時,您會宣告此值。
-
需要
-
當您設定這個屬性值時,COM+ 可確保從元件建立的任何物件都是交易式的。 當 COM+ 啟動具有必要設定的物件時,它會查看其呼叫端的交易狀態。 如果呼叫端有交易,新的物件就會包含在目前的交易中。 否則,COM+ 會開始交易,使新對象成為交易的根目錄。 這是執行資源活動的元件慣用設定,因為它有助於為這些活動提供交易保護。
-
需要更新
-
當您設定這個屬性值時,COM+ 可確保從元件建立的任何物件都必須參與新交易,並作為該交易的根,即使呼叫端的交易狀態不同也不影響。 COM+ 會自動起始一個獨立於呼叫端事務的新事務。
注意
COM+ 不支援巢狀交易。 當某個交易物件呼叫另一個標記為 「需要新」的元件時,COM+ 會為新啟動的物件建立獨立的交易界限。 除非第一筆交易明確記下第二筆交易的結果,並根據這些結果修改其投票,否則第二筆交易不會影響第一筆交易。
交易屬性相依性
下表顯示每個 COM+ 交易屬性值的特性,包括值對交易特性的影響。 COM+ 會強制針對所有交易元件執行 JIT Activation 和 Synchronization。
| 屬性值 | 新增交易 | 客戶的交易 | 交易根基 | 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,將它放在交易中。