transaction transacciones repeatable read niveles lectura ejemplos datos confirmada concurrencia begin aislamiento sql transactions

sql - transacciones - ¿Cómo saber cuándo un esquema de transacción es serializable?



repeatable read (2)

La serialización de transacciones no tiene nada que ver con la serialización de objetos. El nivel de aislamiento de transacción serializable, cuando se implementa por completo, garantiza que el comportamiento de cualquier conjunto de transacciones serializables concurrentes sea consistente con alguna secuencia de ejecución en serie (uno a la vez), como si las transacciones se hubieran ejecutado una a la vez. hora. Esto significa que si puede demostrar que una transacción de base de datos hará lo correcto cuando se ejecuta solo, hará lo correcto en cualquier combinación de transacciones serializables, o se retrotraerá con una falla de serialización para que pueda volverse a intentar. desde el comienzo.

El aislamiento de transacción serializable se puede aplicar de muchas maneras. El esquema más común es el bloqueo estricto de dos fases (S2PL). Este es tan común que a menudo ve respuestas en SO que solo discuten las cosas en términos de esta técnica. También hay control de concurrencia optimista (OCC), aislamiento de instantáneas serializables (SSI) y otros.

Las versiones de PostgreSQL anteriores a 9.1, MS SQL Server en algunas configuraciones y todas las versiones de Oracle en realidad no proporcionan transacciones serializables. Te permiten preguntar por ellos, pero en realidad brindan aislamiento instantáneo. Las versiones de PostgreSQL que comienzan con 9.1 usan SSI cuando se solicita aislamiento de transacción serializable.

No es posible analizar a fondo cómo funciona alguna de estas técnicas en una respuesta SO, sino resumir las técnicas mencionadas anteriormente:

  • En S2PL, cada escritura dentro de una transacción adquiere un bloqueo que no se puede compartir con nada, y cada lectura dentro de la transacción adquiere un bloqueo que se puede compartir con otras lecturas pero que no se puede compartir con una escritura. Los bloqueos de lectura deben cubrir "espacios" en los índices escaneados. Los bloqueos se mantienen hasta el final de la transacción y se liberan atómicamente con el trabajo de la transacción haciéndose visible para otras transacciones. Si el bloqueo crea un ciclo, esto se denomina "interbloqueo" y una de las transacciones involucradas en el ciclo se retrotrae.

  • Bajo OCC una transacción realiza un seguimiento de los datos que ha utilizado, sin bloquearlo. Cuando se solicita confirmación de transacción, la transacción verifica si alguna otra transacción modificó alguno de sus datos y se comprometió. Si es así, la solicitud de confirmación falla y el trabajo se retrotrae.

  • En SSI, las escrituras se bloquean entre sí, pero las lecturas no bloquean las escrituras y las escrituras no bloquean las lecturas. Hay un seguimiento de las dependencias de lectura-escritura para buscar patrones de visibilidad que crearían un ciclo en el orden aparente de ejecución. Si se encuentra una "estructura peligrosa", lo que significa que es posible un ciclo en el orden aparente de ejecución, una de las transacciones involucradas en el ciclo posible se revierte. Es más parecido a OCC que a S2PL, pero no tiene tantos retrocesos como mayor contención.

Descripción completa: me uní a Dan RK Ports de MIT para implementar las nuevas transacciones serializables basadas en SSI en PostgreSQL 9.1.

Estoy estudiando SQL y necesito saber si un determinado esquema de transacción es serializable. Entiendo que el método para determinar esto es hacer un gráfico con las transacciones como nodos y dirección entre los nodos y si el gráfico es cíclico, entonces el esquema no es serializable. Pero, ¿qué significa y qué determina si hay un borde dirigido en el gráfico de una transacción a otra? ¿Es la serialización en este caso el mismo tipo de serialización que la escritura de objetos en el disco?

Gracias por cualquier idea


Serialización significa que la transacción se puede ejecutar en serie, una después de la otra (nada que ver con la serialización de objetos), básicamente una transacción es serializable, independientemente del orden en que se intercalen, el resultado será como si se hubieran ejecutado en una serie De esta manera, si el gráfico es cíclico, entonces no es serializable y existe algún riesgo de conflicto, aquí es donde su nivel de aislamiento ayudará a decidir si la transacción debe ejecutarse en serie, es decir, primero uno y luego el otro o si debe intentar ejecutarlo de forma intercalada esperando que no haya conflictos. No es una respuesta completa, pero espero que esto ayude.