Simultaneidad optimista: Información general
LINQ to SQL admite el control de simultaneidad optimista. En la tabla siguiente se describen los términos que se refieren a la simultaneidad optimista en la documentación de LINQ to SQL:
Términos | Descripción |
---|---|
simultaneidad | Situación en la que dos o más usuarios intentan actualizar la misma fila de la base de datos al mismo tiempo. |
conflicto de simultaneidad | Situación en la cual dos o más usuarios intentan enviar valores incompatibles a una o más columnas de una fila al mismo tiempo. |
control de simultaneidad | Técnica utilizada para resolver los conflictos de simultaneidad. |
control de simultaneidad optimista | Técnica que primero investiga si otras transacciones han cambiado los valores de una fila antes de permitir que se envíen los cambios. Por otra parte, se encuentra el control de simultaneidad pesimista, que bloquea el registro para evitar los conflictos de simultaneidad. El control optimista se denomina así porque considera que son escasas las posibilidades de que una transacción interfiera con otra. |
Resolución de conflictos | Proceso mediante el cual un elemento en conflicto se actualiza volviendo a consultar la base de datos y resolviendo las diferencias. Cuando un objeto se actualiza, el seguimiento de cambios de LINQ to SQL conserva los datos siguientes: - Los valores tomados originalmente de la base de datos y utilizados para la comprobación de actualizaciones. - Los nuevos valores de la base de datos obtenidos en la consulta posterior. Después, LINQ to SQL determina si el objeto está en conflicto (es decir, si uno o más de sus valores de miembro ha cambiado). Si el objeto está en conflicto, LINQ to SQL determina cuál de sus miembros lo está. Cualquier conflicto de miembro que LINQ to SQL detecta se agrega a una lista de conflictos. |
En el modelo de objetos de LINQ to SQL, se produce un conflicto de simultaneidad optimista cuando se dan las dos condiciones siguientes:
El cliente intenta enviar cambios a la base de datos.
Uno o más valores de comprobación de actualizaciones se han actualizado en la base de datos desde la última vez que el cliente los leyó.
Para resolver el conflicto, primero se detectan los miembros del objeto que están en conflicto y, después, se decide qué hacer.
Nota
Solo los miembros asignados como Always o WhenChanged participan en las comprobaciones de simultaneidad optimista. No se realiza ninguna comprobación para los miembros marcados como Never. Para obtener más información, vea UpdateCheck.
Ejemplo
Por ejemplo, en el escenario siguiente, User1 empieza a preparar una actualización consultando una fila en la base de datos. User1 recibe una fila con los valores Alfreds, Maria y Sales.
User1 desea cambiar el valor de la columna Manager a Alfred y el valor de la columna Department a Marketing. Antes de que User1 pudiera enviar los cambios, User2 ha enviado cambios a la base de datos. Por lo tanto, ahora el valor de la columna Assistant ha cambiado a Mary y el valor de la columna Department a Service.
Cuando User1 intenta enviar los cambios, se produce un error en el envío y se inicia una excepción ChangeConflictException. Esto es consecuencia de que los valores de base de datos para la columna Assistant y la columna Department no son los esperados. Los miembros que representan las columnas Assistant y Department están en conflicto. En la tabla siguiente se resume la situación.
State | Manager | Asistente | department |
---|---|---|---|
Estado original | Alfreds | Maria | Ventas |
User1 | Alfred | Marketing | |
User2 | Mary | Servicio |
Puede resolver conflictos como estos de maneras diferentes. Para obtener más información, vea Cómo: Administrar confictos de cambios.
Lista de comprobación para detectar y resolver conflictos
Puede detectar y resolver los conflictos en cualquier nivel de detalle. Por una parte, puede resolver todos los conflictos de una de tres maneras (vea RefreshMode) sin consideraciones adicionales. En el otro extremo, puede designar una acción concreta para cada tipo de conflicto en cada miembro en conflicto.
Especifique o revise las opciones de UpdateCheck en su modelo de objetos.
Para obtener más información, vea Cómo: Especificar en qué miembros se comprueban los conflictos de simultaneidad.
En el bloque la try/catch de la llamada a SubmitChanges, especifique en qué punto desea que se inicien excepciones.
Para obtener más información, vea Cómo: Especificar cuándo se inician las excepciones de simultaneidad.
Determine cuántos detalles del conflicto desea recuperar e incluya el código correspondiente en el bloque try/catch.
Para obtener más información, vea Cómo: Recuperar información de conflictos de entidades y Cómo: Recuperar información de conflictos de miembros.
Indique en el código
try
/catch
cómo desea resolver los distintos conflictos que detecte.Para obtener más información, vea Cómo: Resolver conflictos de simultaneidad conservando valores de base de datos, Cómo: Resolver conflictos de simultaneidad sobrescribiendo valores de base de datos y Cómo: Resolver conflictos de simultaneidad mediante combinaciones con valores de base de datos.
Tipos LINQ to SQL que admiten la detección y resolución de conflictos
Entre las clases y características que admiten la resolución de conflictos de simultaneidad optimista en LINQ to SQL, se incluyen: