# Transacció (informàtica)

Una transacció simbolitza una unitat de treball realitzada en un sistema gestor de bases de dades (o similar) contra una base de dades, i tractada de forma coherent i fiable, independent d'altres transaccions. Generalment, una transacció representa un canvi en la base de dades. En un entorn de bases de dades, les transaccions tenen dos objectius principals:
* Proporcionar un entorn d'unitats de treball fiables que permeti la recuperació correcta en cas de fallades, així com mantenir consistent la base de dades en el cas d'una fallada del sistema, quan s'atura l'execució (completament o parcialment) i moltes operacions sobre una base de dades queden incompletes, amb un estat indefinit.
* Proporcionar compartimentació entre els programes que accedeixen a una base de dades de manera concurrent. Si no existís aquest aïllament, els resultats dels programes podrien ser erronis.
Una transacció de base de dades, per definició, ha de ser atòmica, consistent, aïllada (isolada) i duradora. Els teòrics de bases de dades es refereixen a aquestes propietats de les transaccions amb l'acrònim ACID.
Les transaccions proporcionen un mecanisme "tot o res", en el sentit de què cada unitat de treball realitzada sobre una base de dades actua completament o bé no té cap efecte en absolut. A més, el sistema ha d'aïllar cada transacció de les altres, els resultats han de respectar les restriccions de la base de dades, i les transaccions que es completen han d'emmagatzemar-se en un suport durador.

## Objectiu

Les bases de dades, i altres sistemes d'emmagatzematge que tenen la integritat de dades com a objectiu, inclouen la gestió de transaccions com a mitjà per a preservar la integritat de la informació. Una transacció individual consisteix d'una o més unitats de treball independents, on cadascuna llegeix o escriu informació a la base de dades. Quan això succeeix, és important assegurar-se que tot aquest procés deixa la base de dades en un estat consistent.
Els exemples del sistema de partida doble il·lustren aquest concepte de transacció. En una comptabilitat de sistema doble, tota anotació de dèbit requereix el registre d'una altra anotació de crèdit. Per exemple, si es fa una transferència de 100 €, un sistema transaccional de partida doble ha de registrar aquestes dues anotacions per tal d'incloure la totalitat de la transacció:
* Deduir 100 € del compte del pagador
* Afegir 100 € al compte del beneficiari
Un sistema transaccional faria que totes dues entrades es registressin, o bé que cap de les dues es registrés. Com que es tracten múltiples accions com una unitat de treball transaccional atòmica, el sistema manté la integritat de les dades registrades. En altres paraules, ningú no acaba en una situació on s'anota un dèbit però no un crèdit, o viceversa.

## Bases de dades transaccionals

Una base de dades transaccional és un SGBD on les transaccions tenen la possibilitat de desfer-se ((anglès) roll back o rollback) si no es completen de forma adequada (per exemple, en cas de fallada elèctrica o de pèrdua de connectivitat).
La majoria dels sistemes gestors de bases de dades relacionals moderns són, de fet, bases de dades que suporten transaccions.
En un sistema de base de dades, una transacció pot consistir d'una o més sentències o consultes que manipulin (és a dir, que escriguin i/o llegeixin) la informació de la base de dades. Els usuaris de la base de dades requereixen que les dades siguin consistents i íntegres. La manera d'enviar una transacció a la base de dades es fa mitjançant un llenguatge com SQL, amb un esquema similar a aquest:
* Començar la transacció
* Executar un conjunt de manipulacions i/o consultes
* Si no hi ha cap error, confirmar (commit) la transacció i finalitzar-la
* Si hi ha algun error, desfer (roll back) la transacció i finalitzar-la
Si no hi ha hagut errors durant l'execució de la transacció, llavors el sistema confirma la transacció. L'operació de confirmació (commit) de la transacció s'aplica sobre totes les manipulacions de dades en l'àmbit de la transacció, i les fa permanents sobre la base de dades. Si hi ha algun error durant la transacció, o si l'usuari especifica una operació de rollback, les manipulacions de les dades es desfan i no són permanents a la base de dades. En cap cas es pot confirmar una transacció parcial, ja que això deixaria la base de dades en un estat inconsistent.
Internament, les bases de dades multiusuari emmagatzemen i processen transaccions, sovint utilitzant un ID o XID.

### En SQL

La majoria d'implementacions d'SQL suporten la gestió de transaccions, encara que amb diferent nivell de robustesa. (MySQL, per exemple, no suporta transaccions en el sistema d'emmagatzematge MyISAM, que era el sistema d'emmagatzematge per defecte abans de la versió 5.5.)
Una transacció acostuma a començar amb la comanda BEGIN (encara que l'estàndard SQL especifica START TRANSACTION). Quan el sistema processa una sentència COMMIT, la transacció finalitza amb resultat satisfactori. Una sentència ROLLBACK també finalitza una transacció, desfent totes les modificacions realitzades des de la sentència BEGIN TRANSACTION. Si s'ha desactivat l'autocommit, emprant START TRANSACTION, l'autocommit es reactiva al final de la transacció.
Hom pot determinar el nivell d'aïllament tant per transaccions individuals com a escala global. Si s'activa el nivell READ COMMITTED (llegir dades confirmades), les dades són visibles als altres usuaris només quan la transacció s'ha confirmat. Si s'activa el nivell READ UNCOMMITTED (llegir dades sense confirmar), que es pot usar per assegurar una alta concurrència, els canvis són visibles abans de finalitzar la transacció d'actualització.

## Bases de dades d'objectes

Les bases de dades relacionals tradicionals consisteixen en taules amb camps de longitud fixa i, per tant, els seus registres també tenen longitud fixa. Les bases de dades d'objectes són capaces de gestionar blobs de longitud variable (incorporant possiblement un tipus MIME o serialització). De totes maneres, les bases de dades d'objectes també incorporen els mecanismes d'inici de transaccions, commit i rollback.
Després de començar una transacció, els registres o objectes de la base de dades es bloquegen, sigui en mode de només lectura o de lectura-escriptura. Llavors poden començar les operacions de lectura i d'escriptura. Quan l'usuari està satisfet amb les operacions, tots els canvis es confirmen o es reverteixen atòmicament, de tal manera que al final de la transacció no hi hagi cap inconsistència.

## Transaccions distribuïdes

Els sistemes de bases de dades implementen les transaccions distribuïdes com a transaccions entre diferents aplicacions o servidors. Una transacció distribuïda manté les propietats ACID al llarg de múltiples sistemes, que poden incloure diferents bases de dades, sistemes de fitxers, sistemes de missatgeria i altres aplicacions. En el cas d'una transacció distribuïda, existeix un sistema de coordinació que assegura que totes les parts de la transacció s'apliquen a tots els sistemes rellevamts. De la mateixa manera que amb les transaccions ordinàries, si falla una part qualsevol de la transacció distribuïda, es reverteix la totalitat de la transacció en tots els sistemes afectats.

## Sistemes transaccionals de fitxers

El sistema de fitxer Namesys Reiser4 per a Linux ofereix suport per a transaccions, i a partir de Microsoft Windows Vista, el sistema de fitxers NTFS dona suport a transaccions distribuïdes a través de xarxes.

## Referències

* ↑ Haerder, T.; Reuter, A. «Principles of transaction-oriented database recovery». ACM Computing Surveys, 15, 4, 1983, pàg. 287. DOI: 10.1145/289.291.
* ↑ namesys.com
* ↑ «Transactional NTFS (TxF)». Microsoft. [Consulta: 4 abril 2016].

## Bibliografia

* Bernstein, Philip A.; Newcomer, Eric. Principles of Transaction Processing. 2a edició. Morgan Kaufmann (Elsevier), 2009. ISBN 978-1-55860-623-4.
* Weikum, Gerhard; Vossen, Gottfried. Transactional information systems: theory, algorithms, and the practice of concurrency control and recovery. Morgan Kaufmann, 2001. ISBN 1-55860-508-8.

## Enllaços externs

* c2:TransactionProcessing