Operaciones de administración de COM+ en transacciones

La base de datos de registro COM+ (RegDB) es un administrador de recursos de transacción que puede participar en transacciones COM+. Esto le permite realizar operaciones de administración dentro de una transacción y hacer que todos los cambios de configuración se confirmen o anulen como una operación atómica, incluso en varios equipos. En algunas circunstancias, puede ser muy beneficioso hacerlo, aunque hay un comportamiento de aislamiento y bloqueo que debe tener en cuenta y realizar tareas de administración dentro de las transacciones implica pequeños cambios en el modelo de programación de administración normal.

Ventajas de realizar operaciones de administración en transacciones

  • **Coherencia de los datos:**Las operaciones de administración realizadas en una transacción se confirman o anulan en su conjunto, aunque hay algunos recursos de catálogo COM+ no transaccionales para los que puede que esto no sea el caso. (Consulte los recursos del catálogo COM+ no transaccional a continuación).
  • **Implementación coherente en varias máquinas:**Si va a implementar aplicaciones COM+ en varios servidores, puede garantizar que todos los servidores se dejan con configuraciones idénticas.
  • **Escalado y rendimiento:**Cuando se realizan varias operaciones dentro de una transacción, todas las escrituras en RegDB se realizan a la vez. Las escrituras persistentes en RegDB son una operación relativamente costosa; Si va a realizar muchas escrituras en RegDB, puede obtener una gran ventaja de rendimiento de hacerlos todos a la vez en lugar de cada vez que llame a SaveChanges.

Comportamiento de aislamiento de RegDB

Para garantizar la coherencia de datos adecuada y las transacciones serializables, RegDB aplica un comportamiento de bloqueo y aislamiento concretos cuando se realizan operaciones de administración dentro de las transacciones.

Cada vez que un componente que realiza el trabajo dentro de una transacción llama a cualquier método que provoque una escritura en el catálogo COM+, como SaveChanges, InstallApplication o InstallComponent, se toma un bloqueo de escritor en el código del servidor de catálogo COM+ que impedirá que otros escritores entren hasta que la transacción actual se confirme o anule. Es decir, los escritores solo pueden entrar si tienen la afinidad de transacción correcta y participan en la transacción actual.

Los lectores no están bloqueados. Sin embargo, los datos que ven los lectores no reflejan los cambios provisionales realizados en la transacción hasta que esa transacción se confirma realmente. Todos los componentes que participan en esa transacción ven estados de datos provisionales cuando leen datos, pero todos los componentes fuera de la transacción ven esos cambios solo después de que se haya completado la transacción.

Comportamiento de SaveChanges

Para lograr el comportamiento de aislamiento descrito anteriormente, RegDB proporciona eficazmente una memoria caché en la que actúan los componentes de la transacción. Esto cambia el comportamiento del método SaveChanges .

Normalmente, sin la presencia de una transacción, los cambios pendientes se escriben en el catálogo cuando se llama a SaveChanges y SaveChanges no vuelve hasta que se completan todas las escrituras. Esto garantiza que si una llamada a SaveChanges se devuelve correctamente, puede llamar a StartApplication y activará la aplicación con datos nuevos.

Sin embargo, dentro de una transacción, SaveChanges afecta solo a la memoria caché, no a la propia RegDB, y SaveChanges devuelve inmediatamente si todos los cambios se han confirmado transaccionalmente en RegDB. No hay ninguna garantía de que StartApplication use datos nuevos posteriores a SaveChanges que se devuelvan. Si necesita llamar a StartApplication en este contexto, es aconsejable esperar algún período de tiempo antes de hacerlo.

Período de Time-Out de transacción

Si está realizando numerosas operaciones de administración dentro de una transacción, puede ser una transacción de larga duración. En este caso, el valor de tiempo de espera de la transacción puede ser un problema. Esto viene determinado por el valor de tiempo de espera de transacción establecido para el componente que inicia la transacción o por la configuración de tiempo de espera de toda la máquina en la que se ejecuta ese componente. Si está realizando numerosas operaciones dentro de una transacción, es aconsejable establecer el período de tiempo de espera de transacción adecuado en un valor suficientemente largo y, si es necesario, para restaurar la configuración original cuando haya terminado.

Recursos de catálogo COM+ no transaccionales

El registro, el sistema de archivos y Windows Installer (MSI) son recursos de catálogo COM+ que no son transaccionales.

Nota

Si se produce un error que anula una transacción, es posible que los cambios realizados en estos recursos no se revierten.

 

Si se produce un error al instalar una aplicación COM+ existente desde un archivo .msi, la aplicación no aparece en el complemento Servicios de componentes, pero puede aparecer en Agregar o quitar programas, en cuyo caso necesita quitarlo manualmente.

Recuperar en caso de bloqueo del sistema

Si un componente que realiza operaciones de administración dentro de una transacción se bloquea mientras mantiene un bloqueo de escritor en el código del servidor de catálogo, impediría que todos los demás realicen cambios en el catálogo. En caso de que esto suceda, puede borrar el bloqueo en el catálogo cerrando y reiniciando la aplicación Del sistema.

Scripting con un objeto TransactionContext

Una manera sencilla de realizar operaciones de administración dentro de las transacciones es usar un objeto TransactionContext para controlar la transacción. Por ejemplo, el siguiente script de Visual Basic muestra cómo agregar transaccionalmente dos nuevas aplicaciones para que ambas aplicaciones o ninguna de ellas se cree:

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

Control de errores de administración de COM+

Ejemplo introductorio con el catálogo de administración de COM+

Información general sobre los objetos COMAdmin

Recuperación de colecciones en el catálogo COM+

Establecer propiedades y guardar cambios en el catálogo de COM+