Pregunta duplicada de:
/programming/129329/optimistic-vs-pessimistic-locking
Copie / pegue la respuesta del enlace anterior:
El bloqueo optimista es una estrategia en la que lee un registro, toma nota de un número de versión y comprueba que la versión no ha cambiado antes de volver a escribir el registro. Cuando vuelve a escribir el registro, filtra la actualización de la versión para asegurarse de que sea atómica. (es decir, no se ha actualizado entre cuando verifica la versión y escribe el registro en el disco) y actualiza la versión de un solo golpe.
Si el registro está sucio (es decir, una versión diferente a la suya), cancela la transacción y el usuario puede reiniciarla.
Esta estrategia es más aplicable a sistemas de alto volumen y arquitecturas de tres niveles donde no necesariamente mantiene una conexión a la base de datos para su sesión. En esta situación, el cliente no puede mantener los bloqueos de la base de datos ya que las conexiones se toman de un grupo y es posible que no esté utilizando la misma conexión de un acceso a otro.
El bloqueo pesimista es cuando bloquea el registro para su uso exclusivo hasta que haya terminado con él. Tiene una integridad mucho mejor que el bloqueo optimista, pero requiere que tenga cuidado con el diseño de su aplicación para evitar puntos muertos. Para usar el bloqueo pesimista, necesita una conexión directa a la base de datos (como suele ser el caso en una aplicación de servidor de cliente de dos niveles) o un ID de transacción disponible externamente que se pueda usar independientemente de la conexión.
En el último caso, abre la transacción con el TxID y luego se vuelve a conectar con esa ID. El DBMS mantiene los bloqueos y le permite recuperar la sesión a través del TxID. Así es como funcionan las transacciones distribuidas que utilizan protocolos de confirmación de dos fases (como XA o COM + Transacciones).
Editar (Agregar más información para abordar la pregunta de rendimiento):
En cuanto al rendimiento, depende de su entorno. Tome los siguientes factores para decidir:
Va a encontrar optimista será mejor debido a la concurrencia en la mayoría de las situaciones. Dependiendo del RDBMS y el entorno, esto podría ser menos o más eficiente. Normalmente, con el bloqueo optimista, encontrará que el valor debe ser versionado en fila en algún lugar.
Con MS SQL Server, por ejemplo, se mueve a TempDB y se agrega algo entre 12-14 bytes al final de la columna. Activar el bloqueo optimista con un nivel de aislamiento como el aislamiento de instantáneas puede causar fragmentación y su factor de relleno deberá ajustarse ya que las filas ahora tienen datos adicionales al final, lo que podría hacer que una página esté casi llena y se divida, lo que disminuirá tu actuación. Si su TempDB no está optimizada, no será tan rápido.
Entonces supongo que una lista de verificación es:
- -¿Tiene suficientes IO / recursos para manejar la forma de versiones de fila? Si no, está agregando gastos generales. Si es así, si está leyendo los datos a menudo mientras los bloquea para las escrituras, notará una buena mejora en la concurrencia entre lecturas y escrituras (aunque las escrituras seguirán bloqueando las escrituras, las lecturas ya no bloquearán las escrituras y viceversa)
- -¿Su código es susceptible a puntos muertos o experimenta bloqueo? Si no está experimentando bloqueos largos o muchos puntos muertos, entonces la sobrecarga adicional del bloqueo optimista no aceleraría las cosas, por supuesto, en la mayoría de los casos estamos hablando de milisegundos aquí.
- -Si su base de datos es grande (o en un hardware muy limitado) y sus páginas de datos están casi llenas, dependiendo del RDBMS, podría causar divisiones de página importantes y fragmentación de datos, así que asegúrese de considerar reindexar después de encenderlo.
Esos son mis pensamientos al respecto, abiertos a escuchar más de la comunidad.