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.





