Hay una consulta con Gap Lock utilizada en MySQL/InnoDB:
SELECT id, time, count FROM table_a WHERE time BETWEEN DATE_SUB(NOW(), INTERVAL 24 HOUR) AND NOW() FOR UPDATE Bloquea el rango de time y devuelve un registro reciente si está presente (durante las últimas 24 horas). De lo contrario, la sesión aún posee un bloqueo durante las últimas 24 horas para insertar de manera segura un nuevo registro.
¿Es posible hacer el mismo bloqueo de brecha durante las 24 horas completas (incluso si no hay registros) en PostgreSQL?
La forma de hacerlo en PostgreSQL es usar el nivel de aislamiento SERIALIZABLE para todas las transacciones.
Entonces no necesita FOR UPDATE en absoluto. PostgreSQL no evitará que se inserten filas en el espacio, pero si dos transacciones leen y escriben valores en el mismo espacio simultáneamente, una de ellas obtendrá un error de serialización y tendrá que rehacer la transacción (en el segundo intento, lo hará). encontrar el hueco no vacío).
El concepto en el trabajo aquí es la serialización: es aceptable si alguien más se inserta en el espacio sin leer (esa transacción es lógicamente posterior a la que tiene su SELECT ). Pero si dos transacciones encuentran el espacio vacío y luego insertan algo, eso crearía una anomalía que SERIALIZABLE .