Operaciones de administración de COM+ dentro de 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 dentro de transacciones
- **Coherencia de los datos:**Las operaciones de administración realizadas dentro de 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 transaccionales 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 quedan 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 cualquier otro escritor llegue 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 ningún cambio provisional realizado dentro de la transacción hasta que esa transacción se confirme realmente. 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 la transacción se haya completado.
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 SaveChangesy SaveChanges no devuelve hasta que se completan todas las escrituras. Esto garantiza que si una llamada a SaveChanges 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 devolver. 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 transacciones
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 todo el equipo en el 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, 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 de .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.
Recuperación en caso de bloqueo del sistema
Si un componente que realiza operaciones de administración dentro de una transacción se bloquea mientras contiene un bloqueo de escritor en el código del servidor de catálogos, impediría que todos los demás realicen cambios en el catálogo. Si esto ocurre, puede borrar el bloqueo en el catálogo cerrando y reiniciando la aplicación 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 aplicaciones nuevas para que ambas aplicaciones o ninguna aplicación 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
Temas relacionados
-
ejemplo introductorio mediante el catálogo de administración de COM+
-
establecer propiedades y guardar cambios en el catálogo COM+