Tengo una tabla db postgres (PostgreSQL 12.3) que consta de 100k filas y tengo un script de python que lee de esta tabla y realiza alguna acción basada en los datos. Quiero ejecutar el mismo script en varias máquinas para que los datos se puedan procesar más rápido. Pero cuando ejecuto desde varias máquinas, quiero asegurarme de que una fila sea procesada por una sola máquina a la vez, básicamente al bloquear esa fila.
¿Puede proporcionar algunos consejos sobre cómo se puede lograr la fila de bloqueo a través de python? Estoy usando el módulo psycopg2 para leer y actualizar datos de la tabla, pero no encontré una forma de bloquear los datos de la fila.
Use SELECT ... FOR UPDATE SKIP LOCKED , que realiza un bloqueo de nivel de fila en cualquier fila que se devuelva y omite las filas que ya están bloqueadas por otra transacción.
Sesión 1:
testdb=# create table tt(x text); CREATE TABLE testdb=# insert into tt select 'foo'; INSERT 0 1 testdb=# insert into tt select 'bar'; INSERT 0 1 testdb=# BEGIN; BEGIN testdb=# SELECT * FROM tt ORDER BY x LIMIT 1 FOR UPDATE SKIP LOCKED; x ----- bar (1 row) testdb=# -- SELECT in session 2 is performed now. testdb=# commit; COMMITSesión 2:
testdb=# BEGIN; BEGIN testdb=# SELECT * FROM tt ORDER BY x LIMIT 1 FOR UPDATE SKIP LOCKED; x ----- foo (1 row) testdb=# commit; COMMITNo necesitará hacer nada especial con psycopg2 para esto, siempre que su consulta ya tenga un límite razonablemente pequeño (para que SELECT no bloquee todas las filas), agregar FOR UPDATE SKIP LOCKED debería hacer lo que está pidiendo . Consulte los documentos sobre la cláusula de bloqueo para obtener más detalles.