共用方式為


交易內的 COM+ 管理作業

COM+ 註冊資料庫 (RegDB) 是可參與 COM+ 交易的交易資源管理員。 這可讓您在交易內執行管理作業,並讓所有設定變更都認可或中止為不可部分完成的作業,即使在多部計算機上也是如此。 在某些情況下,雖然您應該考慮隔離和封鎖行為,但在交易內執行系統管理工作確實牽涉到對一般系統管理程序設計模型的稍微變更,但這樣做會很有説明。

在交易中執行管理作業的優點

  • **數據的一致性—**在交易內執行的系統管理作業會認可或中止整體,不過有些非交易式 COM+ 目錄資源可能並非如此。 (請參閱下面的非交易式 COM+ 目錄資源。
  • **跨多部機器進行一致的部署—**如果您要跨多部伺服器部署 COM+ 應用程式,您可以保證所有伺服器都保留相同的設定。
  • **調整和效能—**當您在交易內執行多個作業時,所有寫入 RegDB 都會一次執行。 對 RegDB 的持續性寫入是相對昂貴的作業;如果您要對 RegDB 進行許多寫入,則只要呼叫 saveChanges ,就能從一次執行這些作業,而獲得巨大的效能好處。

RegDB 的隔離行為

為了確保適當的數據一致性和可串行化交易,RegDB 會在交易內執行管理作業時強制執行特定的封鎖和隔離行為。

每當在交易內執行工作的元件呼叫會導致寫入 COM+ 類別目錄的任何方法時,例如 SaveChangesInstallApplicationInstallComponent,都會對 COM+ 目錄伺服器程式代碼進行寫入鎖定,以封鎖任何其他寫入器進入,直到目前的交易認可或中止為止。 也就是說,只有當寫入器具有正確的交易親和性且參與目前交易時,才能傳入。

讀取器不會遭到封鎖。 不過,讀取器看到的數據不會反映交易內所做的任何過渡性變更,直到該交易實際認可為止。 參與該交易的任何元件都會在讀取數據時看到過渡期數據狀態,但交易以外的所有元件只有在交易完成之後才會看到這些變更。

SaveChanges 行為

為了達到上述的隔離行為,RegDB 可有效地提供由交易內元件執行的快取。 這會變更 saveChanges方法的行為。

一般而言,如果沒有交易存在,當您呼叫 saveChanges 時,任何暫止的變更都會寫入目錄,而且在完成所有寫入之前,SaveChanges 不會傳回。 這可確保如果呼叫 SaveChanges 傳回成功,您可以呼叫 StartApplication,而且會以全新的數據啟動應用程式。

不過,在交易中,SaveChanges 只會影響快取,而不是 RegDB 本身,SaveChanges 會立即傳回所有變更是否已交易式認可至 RegDB。 不保證 StartApplication 會使用傳回 saveChanges 之後的全新數據。 如果您需要在此內容中呼叫 StartApplication,建議您先等候一段時間再這麼做。

交易 Time-Out 期間

如果您在交易內執行許多系統管理作業,則可能是長時間執行的交易。 在此情況下,交易逾時值可能是問題。 這是由針對起始交易的元件所設定的交易逾時值,或由執行該元件之計算機的全電腦逾時設定來決定。 如果您在交易內執行許多作業,建議您在完成時將適當的交易逾時期間設定為足夠長的值,並視需要還原原始設定。

非交易式 COM+ 目錄資源

登錄、文件系統和 Windows Installer (MSI) 是非交易式的 COM+ 目錄資源。

注意

如果發生中止交易的錯誤,這些資源的變更可能不會回復。

 

如果從 .msi 檔案安裝現有的 COM+ 應用程式時發生錯誤,應用程式不會出現在元件服務嵌入式管理單元中,但可能會出現在 [新增/移除程式] 中,在此情況下,您需要手動移除它。

在系統停止回應時復原

如果在交易內執行管理作業的元件在目錄伺服器程序代碼上保留寫入器鎖定時停止回應,則會封鎖其他人對目錄進行任何變更。 如果發生這種情況,您可以關閉並重新啟動系統應用程式,以清除目錄上的鎖定。

使用 TransactionContext 物件編寫腳本

在交易內執行管理作業的簡單方式是使用 TransactionContext 物件來控制交易。 例如,下列Visual Basic腳本示範如何以交易方式新增兩個新應用程式,以便同時建立兩個應用程式或兩個應用程式:

Dim txctx
Dim cat
Dim apps
Dim app1
Dim app2
  
WScript.Echo "Starting"
Set txctx = CreateObject("TxCtx.TransactionContext")
Set cat = txctx.CreateInstance("COMAdmin.COMAdminCatalog")
Set apps = cat.GetCollection("Applications")
Set app1 = apps.Add
app1.Value("Name") = "Test App #1"
apps.SaveChanges
Set app2 = apps.Add
app2.Value("Name") = "Test App #2"
apps.SaveChanges
  
WScript.Echo "Ending"
txctx.Commit

處理 COM+ 管理錯誤

使用 COM+ 系統管理類別目錄 簡介範例

COMAdmin 物件概觀

在 COM+ 目錄 上擷取集合

設定屬性並將變更儲存至 COM+ 目錄