rimoso autocommit nei pool

This commit is contained in:
2025-06-13 08:34:59 +02:00
parent 40a1ac23ee
commit 726d04ace3

View File

@@ -32,6 +32,10 @@ NO_RECORD_SLEEP = 60
async def get_next_csv_atomic(pool, table_name):
"""Preleva atomicamente il prossimo CSV da elaborare"""
async with pool.acquire() as conn:
# IMPORTANTE: Disabilita autocommit per questa transazione
await conn.begin()
try:
async with conn.cursor() as cur:
# Usa SELECT FOR UPDATE per lock atomico
await cur.execute(f"""
@@ -51,9 +55,15 @@ async def get_next_csv_atomic(pool, table_name):
WHERE id = %s
""", (result[0],))
# Commit esplicito per rilasciare il lock
await conn.commit()
return result
except Exception as e:
# Rollback in caso di errore
await conn.rollback()
raise e
async def worker(worker_id: int, cfg: object, pool) -> None:
# Imposta il context per questo worker
worker_context.set(f"W{worker_id}")
@@ -73,6 +83,7 @@ async def worker(worker_id: int, cfg: object, pool) -> None:
logger.error("Errore durante l'elaborazione")
await asyncio.sleep(CSV_PROCESSING_DELAY)
else:
logger.debug("Nessun record disponibile")
await asyncio.sleep(NO_RECORD_SLEEP)
except Exception as e:
@@ -84,13 +95,13 @@ async def load_csv(record: tuple, cfg: object, pool) -> bool:
logger.debug("Inizio ricerca nuovo CSV da elaborare")
id, unit_type, tool_type, unit_name, tool_name = record
logger.info(f"Trovato CSV da elaborare: ID={id}, Tipo={unit_type}_{tool_type}, Nome={unit_name}_{tool_name}")
logger.info(f'Trovato CSV da elaborare: ID={id}, Tipo={unit_type.lower().replace(" ", "_")}_{tool_type.lower().replace(" ", "_")}, Nome={unit_name.lower().replace(" ", "_")}_{tool_name.lower().replace(" ", "_")}')
# Costruisce il nome del modulo da caricare dinamicamente
module_names = [f'utils.parsers.by_name.{unit_name.lower()}_{tool_name.lower()}',
f'utils.parsers.by_name.{unit_name.lower()}_{tool_type.lower()}',
f'utils.parsers.by_name.{unit_name.lower()}_all',
f'utils.parsers.by_type.{unit_type.lower()}_{tool_type.lower()}']
module_names = [f'utils.parsers.by_name.{unit_name.lower().replace(" ", "_")}_{tool_name.lower().replace(" ","_")}',
f'utils.parsers.by_name.{unit_name.lower().replace(" ", "_")}_{tool_type.lower().replace(" ","_")}',
f'utils.parsers.by_name.{unit_name.lower().replace(" ", "_")}_all',
f'utils.parsers.by_type.{unit_type.lower().replace(" ", "_")}_{tool_type.lower().replace(" ","_")}']
modulo = None
for module_name in module_names:
try:
@@ -150,8 +161,7 @@ async def main():
db=cfg.dbname,
minsize=1,
maxsize=cfg.max_threads*4,
pool_recycle=3600,
autocommit=True
pool_recycle=3600
)
# Avvia i worker