¿Por qué el bloqueo optimista es más rápido que el bloqueo pesimista?


9

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!


55
Existe una explicación muy corta en el nombramiento. El bloqueo optimista funciona bien cuando la posibilidad de un bloqueo conflictivo es baja. Somos optimistas sobre la interacción de múltiples procesos. El bloqueo pesimista funciona bien cuando la posibilidad de un bloqueo conflictivo es alta. Somos pesimistas sobre la interacción de múltiples procesos. Ambos rendirán de manera subóptima donde su opuesto sería más apropiado.
Mark Storey-Smith

El bloqueo optimista puede o no ser más rápido que el bloqueo pesimista, dependiendo de su carga de trabajo.
AK

Respuestas:


8

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.


Gracias @Ali Razeghi (+1) - Creo que dba.se es un lugar más apropiado para esta pregunta. Además, aunque esta es una respuesta excelente, no responde a mi pregunta de rendimiento (cuando una es más rápida que la otra). ¡Gracias de nuevo!
Mara

Hola Mara, ese es un buen punto. He ampliado la respuesta. Gracias.
Ali Razeghi

11

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".


1

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.


punto interesante a1ex07, el bloqueo optimsitic todavía incluye el bloqueo, sin embargo, ya que las escrituras siempre bloquearán otras escrituras, ¿correcto?
Ali Razeghi

No, no lo hace. Por eso es "más rápido".
Erwin Smout

Ese podría ser el caso de Oracle, pero para MS SQL Server, ya que utiliza el nivel de aislamiento 'lectura confirmada' de forma predeterminada, el bloqueo optimista permitirá que los hilos de lectores y escritores trabajen simultáneamente, pero las escrituras bloquearán las escrituras hasta que el hilo de bloqueo se comprometa.
Ali Razeghi

@ Ali Razeghi: No estoy seguro de seguir tu punto. En SQLServer con escritores comprometidos de lectura, se bloquean los lectores de forma predeterminada a menos que `READ_COMMITTED_SNAPSHOT` esté activado. El bloqueo optimista no es un bloqueo en el recurso db (fila / página / tabla), sino más bien algún tipo de acuerdo entre todas las aplicaciones que usan la base de datos para no actualizar el registro si la versión no coincide con lo esperado.
a1ex07

1
@Eamon Nerbonne: Dije sobre 'los escritores no bloquean a los lectores' ... ¿Dónde vieron que menciono algo sobre "los escritores bloquean / no bloquean a los escritores"?
a1ex07

0

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


-3

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:

SELECT COUNT(*) FROM atable

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!


44
El enfoque de control de concurrencia DBMS es ortogonal al bloqueo optimista / pesimista, y comparar los tiempos de ejecución de consultas en dos DBMS diferentes es engañoso.
mustaccio

debido a que SQL Server puede hacer los dos modos de bloqueo, puede comparar esto fácilmente haciendo una marca real en un enfoque de concurrencia de usuario.
user7370003
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.