Ambas formas de bloqueo hacen que un proceso espere una copia correcta del registro si otro proceso lo está utilizando actualmente. Con el bloqueo pesimista, el mecanismo de bloqueo proviene de la propia base de datos (un objeto de bloqueo nativo), mientras que con el bloqueo optimista, el mecanismo de bloqueo es una forma de versiones de fila como una marca de tiempo para verificar si un registro está "obsoleto" o no.
Pero ambos causan que se cuelgue un segundo proceso. Entonces pregunto: ¿por qué el bloqueo optimista generalmente se considera más rápido / superior que el bloqueo pesimista? Y, ¿hay casos de uso en los que se prefiere pesimista sobre optimista? ¡Gracias por adelantado!
performance
locking
rdbms
Mara
fuente
fuente
Respuestas:
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:
Esos son mis pensamientos al respecto, abiertos a escuchar más de la comunidad.
fuente
No entiendes el bloqueo optimista.
El bloqueo optimista no hace que las transacciones se esperen entre sí.
El bloqueo optimista posiblemente hace que una transacción falle, pero lo hace sin que se haya tomado ningún "bloqueo". Y si una transacción falla debido al bloqueo optimista, el usuario debe comenzar de nuevo. La palabra "optimista" se deriva exactamente de la expectativa de que la condición que hace que las transacciones fallen por esta misma razón, ocurrirá solo muy excepcionalmente. El bloqueo "optimista" es el enfoque que dice "No utilizaré bloqueos reales porque espero que no sean necesarios de todos modos. Si resulta que estaba equivocado sobre eso, aceptaré el inevitable fracaso".
fuente
El bloqueo optimista es generalmente más rápido porque en realidad no hay bloqueo desde el punto de vista de la base de datos. Depende completamente de la aplicación si se respeta la columna de versión (o pseudocolumna, como ora_rowscn) o no. Normalmente tiene muchas aplicaciones conectadas a la misma base de datos, por lo que db se convierte en un recurso compartido y, si se bloquea, todos los clientes se verán afectados.
Con una estrategia de bloqueo optimista, el "bloqueo" ocurre en el lado del cliente y no afecta a los demás.
Sin embargo, si un registro se actualiza con frecuencia, puede terminar releyéndolo demasiadas veces (en caso de bloqueo optimista), lo que anulará los mayores beneficios de la estrategia optimista.
No estaría de acuerdo con la superioridad de ninguno de los enfoques; ambos pueden ser mal utilizados. El pesimista es más propenso a errores solo porque es más peligroso: el bloqueo se produce en el nivel de base de datos, depende del RDMS.
fuente
El bloqueo optimista supone que las transacciones concurrentes pueden completarse sin afectarse entre sí. Por lo tanto, el bloqueo optimista es más rápido porque no se aplican bloqueos al realizar transacciones. Es la prevención de causar problemas de concurrencia no cura. La transacción solo verifica (conjuntos de datos de tres formas, tipo de datos de marca de tiempo, verificar el valor antiguo y nuevo) los datos de que ninguna otra transacción ha modificado los datos. En caso de modificación, la transacción se revierte.
El bloqueo pesimista supone que las transacciones concurrentes entrarán en conflicto entre sí, por lo que requiere bloqueo, se realiza especificando el nivel de AISLAMIENTO (lectura no comprometida, lectura comprometida, lectura repetible y serializable) de la gestión de transacciones. Cura los problemas de concurrencia al adquirir el bloqueo. los bloqueos sirven para proteger recursos u objetos compartidos (tablas, filas de datos, bloques de datos, elementos en caché, conexiones y sistemas completos). Tenemos muchos tipos de bloqueos como bloqueos compartidos, bloqueo de actualización, bloqueo de inserción, bloqueos exclusivos, bloqueos de transacciones, bloqueos DML, bloqueos de esquema y bloqueos de recuperación y copia de seguridad.
para tener mas idea
fuente
Es falso decir que el bloqueo pesimista es más lento que optimista o decir que optimista es más rápido. Una consulta clásica para demostrar esta forma de pensar inapropiada es hacer un agregado en los diferentes RDBMS, como:
Verá que, en el RDBMS que admite un enfoque optimista de forma nativa, el tiempo que lleva esta consulta es mucho más significativo que aquellos que tienen un bloqueo pesimista de forma nativa
Por ejemplo, en mi PC, la misma consulta toma 27 ms en SQL Server y 109 en PostGreSQL ...
¡La sobrecarga adicional necesaria para leer las versiones muertas de las filas de MVCC y no contar los registros de fantasmas en el agregado agrega costos adicionales que el pesimista no tiene!
fuente