Tengo una serie de declaraciones SQL que se parecen a lo siguiente:
BEGIN;
SELECT counter FROM table WHERE id=X FOR UPDATE;
REALLY COMPLEX QUERY;
UPDATE table SET counter=Y WHERE id=X;
END;
Me gustaría evitar que se lea el contador mientras recupero su valor, pero según los documentos de Postgres "Los bloqueos de nivel de fila no afectan la consulta de datos; bloquean solo los escritores en la misma fila".
Preguntas:
- ¿Cuál es el punto de un bloqueo de fila "exclusivo" si no impide las lecturas? ¿Es solo para evitar que otras transacciones tomen acciones bloqueadas?
- Si leo la fila con SELECT ... FOR SHARE, ¿eso logra el mismo efecto que un bloqueo "exclusivo"?
- ¿Es posible desactivar MVCC para una tabla / esquema / base de datos y permitir escrituras en el lugar?
fuente