Transaccions en Django i Bloquejos a PostgreSQL: Per què la teva Base de Dades és més Lenta del que Creus

Descobreix com funcionen les transaccions a Django, quines operacions evitar per millorar el rendiment i com els bloquejos en bases de dades PostgreSQL afecten la concurrència.

martes, 25 de marzo de 2025 • 4 min de lectura • Equip Q2BSTUDIO

Empresa-Software-Apps-Intel·ligènciaArtificial

Aquest és el final d'una sèrie de tres parts sobre com funcionen les transaccions a Django. Es cobreix tot, des de l'aplicació i el codi del framework fins a la capa de base de dades.

  • Part 1 — Python: Com funcionen les transaccions a Django
  • Part 2 — Python: Django, què NO has d'incloure en una transacció

A Q2BSTUDIO, empresa especialitzada en desenvolupament i serveis tecnològics, treballem amb les millors pràctiques per assegurar sistemes eficients i rendibles, optimitzant cada interacció amb la base de dades i assegurant una correcta gestió de transaccions.

Resum de la Part 2 - Què MAI has d'incloure en una Transacció

En la part anterior vam explorar quines operacions i codi a la base de dades s'han d'evitar dins d'una transacció per prevenir respostes lentes i possibles caigudes del sistema. També vam explicar quins elements es poden incloure en una transacció per mantenir el seu comportament atòmic.

  • Permès dins d'una transacció:
  • Operacions reversibles a la base de dades
  • Lògica de negoci relacionada
  • Arriscat dins d'una transacció:
  • Consultes lentes
  • Operacions en múltiples taules
  • Migracions de dades
  • Canvis en l'estructura de l'esquema
  • No permès dins d'una transacció:
  • Operacions irreversibles
  • Crides bloquejants (com sol·licituds de xarxa o lectura de fitxers)

Administrar el codi dins de les transaccions ens permet controlar els bloquejos que es mantenen i la seva durada. Amb això es minimitza el temps d'execució de cada transacció, es redueix la latència de la base de dades i s'evita bloquejar altres consultes crítiques. Tanmateix, com interactuen les operacions a la base de dades i quines poden entrar en conflicte?

Resum Ràpid

Els bloquejos a la base de dades existeixen perquè múltiples usuaris poden executar comandes simultàniament. Per exemple, si un usuari intenta eliminar una taula mentre un altre està llegint les seves dades, això podria causar errors o corrupció de dades. Per evitar-ho, cada operació obté i manté un bloqueig que depèn dels permisos que requereixi.

Hi ha dos tipus principals de bloquejos a PostgreSQL: bloquejos de taula i bloquejos de fila.

  • Els bloquejos a nivell de taula afecten tota l'estructura, per tant són els més arriscats. Si es manté un bloqueig de taula durant molt de temps, altres consultes es veuran afectades, generant possibles temps d'espera i caigudes.
  • Els bloquejos a nivell de fila afecten només un registre específic. Són menys arriscats, però si una migració de dades bloqueja cada fila individualment, podria bloquejar la taula completa de manera inadvertida.

A Q2BSTUDIO optimitzem l'ús de transaccions a Django per minimitzar els riscos de bloquejos i garantir que el rendiment del sistema sigui òptim.

Operacions i el seu Impacte en Bloquejos

Les següents operacions poden afectar l'accés a les taules:

  • Operacions que bloquegen tot (lectures i escriptures):
  • ALTER INDEX/TAULA
  • DROP TABLE
  • TRUNCATE
  • REINDEX
  • CLUSTER
  • Operacions que bloquegen escriptures (inserció, actualització i eliminació de dades):
  • CREATE TRIGGER
  • ALTER TABLE
  • CREATE INDEX

Les migracions a Django, per exemple, poden contenir canvis a l'esquema que bloquegen l'accés a les taules. Per avaluar què farà una migració abans d'executar-la, es recomana utilitzar:

./manage.py sqlmigrate APP_NAME MIGRATION_NUM

Això mostrarà quines operacions s'executaran i permetrà anticipar si causaran bloquejos a la base de dades.

Bloquejos en Files i el seu Impacte

A diferència dels bloquejos de taula, els bloquejos a nivell de fila bloquegen només registres específics. Tanmateix, si dins d'una transacció s'executen múltiples modificacions a files, l'acumulació de bloquejos pot interferir amb altres processos que intenten modificar la mateixa taula.

Per exemple, si dins d'una transacció es recorren totes les files d'una taula per modificar dades, cada fila serà bloquejada fins al final de la transacció, cosa que podria impedir altres actualitzacions a la mateixa taula. En aquests casos, és recomanable evitar embolicar tota l'operació en una transacció global i en lloc seu aplicar transaccions més petites que alliberin els seus bloquejos un cop es processin les dades de cada fila.

Veure el SQL que Executarà una Migració a Django

./manage.py sqlmigrate APP_NAME MIGRATION_NUMBER/NAME

Aquesta comanda imprimirà les operacions SQL que s'executaran, permetent avaluar si afecten l'accés a les taules. Per exemple, una migració que no fa canvis a la base de dades només mostrarà un comentari:

BEGIN;
 - 
 - Alter field transaction_status on transactions
 - 
COMMIT;

Mentre que una migració que afegeix una nova columna mostrarà una comanda ALTER TABLE que pot bloquejar altres operacions:

BEGIN;
 - 
 - Add field reverted to transactions
 - 
ALTER TABLE 'transactions' ADD COLUMN 'reverted' timestamp with time zone NULL;
COMMIT;

A Q2BSTUDIO recomanem optimitzar les migracions per evitar bloquejos innecessaris i assegurar l'estabilitat de la base de dades.

UNA PAUSA?

Juga una estona abans de marxar

ELS NOSTRES SERVEIS

Com et podem ajudar

Tens un projecte en ment?

Explica'ns la teva visió i la convertim en una solució de programari. Sigui quin sigui l'abast, fem realitat la teva idea.