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.

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:

Consulte también