Transazioni XA

Panoramica

L'implementazione di XA in MariaDB è basata sul documento di X/Open CAE chiamato Distributed Transaction Processing: The XA Specification. Questo documento è distribuito da The Open Group ed è reperibile all'indirizzo http://www.opengroup.org/public/pubs/catalog/c193.htm.

Le transazioni XA sono progettate per essere transazioni distribuite, dove un transaction manager (l'applicazione) controlla una transazione che coinvolge più risorse. Queste risorse sono solitamente DBMS, ma possono essere risorse di qualunque tipo. L'insieme delle operazioni transazionali richieste si chiama transazione globale. Ogni sottoinsieme di operazioni che coinvolge una sola risorsa si chiama transazione locale. XA utilizza il commit a due fasi (two-phases commit, 2PC). Con il primo commit, il transaction manager chiede alla risorsa di preparare il commit effettivo, e attende un messaggio di conferma. Le modifiche non sono ancora effettive, a questo punto. Se una qualsiasi risorsa ha riscontrato un errore, il transaction manager annullerà la transazione globale. Se tutte le risorse comunicano che il primo commit ha avuto successo, il transaction managaer può richiedere il secondo commit, che rende le modifiche effettive.

In MariaDB, le transazioni XA possono essere utilizzate solo con gli storage engine che le supportano. Almeno InnoDB, TokuDB e SPIDER le supportano. Per InnoDB, le transazioni XA possono essere disabilitate impostando la variabile di sistema innodb_support_xa a 0. Le transazioni XA non sono attualmente disponibili in MariaDB Galera Cluster.

Come le transazioni normali, le transazioni XA creano dei lock sui metadati delle tabelle a cui accedono.

Cercare di avviare più di una transazione XA allo stesso tempo produce un errore 1400 (SQLSTATE 'XAE09'). Lo stesso errore viene prodotto se si avvia una transazione XA mentre è in corso una transazione normale. Cercare di avviare una transazione normale mentre una transazione XA è in corso produce un errore 1399 (SQLSTATE 'XAE07').

Le istruzioni che causano un COMMIT implicito per le transazioni normali producono un errore 1400 (SQLSTATE 'XAE09') se una transazione XA è in corso.

Sintassi

XA {START|BEGIN} xid [JOIN|RESUME]

XA END xid [SUSPEND [FOR MIGRATE]]

XA PREPARE xid

XA COMMIT xid [ONE PHASE]

XA ROLLBACK xid

XA RECOVER

xid: gtrid [, bqual [, formatID ]]

L'interfaccia alle transazioni XA è un insieme di istruzioni SQL che iniziano con XA. Ogni istruzione modifica lo stato della transazione, determinando quali prossime azioni potrà compiere. Una transazione che non esiste è nello stato NON-EXISTING.

XA START (o BEGIN) avvia una transazione e definisce il suo xid (l'identificatore della transazione). Le parole chiave JOIN e RESUME non hanno effetto. La nuova transazione sarà nello stato ACTIVE.

Lo xid può avere tre componenti, sebbene solo la prima sia obbligatoria. gtrid è una stringa virgolettata che trappresenta l'identificatore della transazione globale. bqual è una stringa virgolettata che rappresenta l'identificatore della transazione locale. formatID è un intero senza segno che indica il formato utilizzato per i primi due componenti; se non è specificato, il default è 1. MariaDB non interpreta in alcun modo questi componenti, li utilizza solo per identificare le transazioni. Gli xid delle transazioni in corso devono essere univoci.

XA END dichiara che la transazione specificata, nello stato ACTIVE, è terminata; perciò passa ora allo stato IDLE. SUSPEND [FOR MIGRATE] non ha effetto.

XA PREPARE prepara una transazione IDLE per il commit, modificando il suo stato in PREPARED. Questo è il primo commit.

XA COMMIT effettua il commit definitivo e termina una transazione che era nello stato PREPARED. Se si specifica la clausola ONE PHASE, questa istruzione effettua il commit a 1 fase su una transazione IDLE.

XA ROLLBACK annulla e termina una transazione IDLE o PREPARED.

XA RECOVER mostra informazioni su tutte le transazioni PREPARED.

Quando si tenta di eseguire un'operazione che non è permessa su una transazione nello stato corrente, viene prodotto un errore:

XA COMMIT 'test' ONE PHASE;
ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed when global transaction is in the  ACTIVE state

XA COMMIT 'test2';
ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed when global transaction is in the  NON-EXISTING state

XA RECOVER

L'istruzione XA RECOVER mostra informazioni su tutte le transazioni che sono nello stato PREPARED. Non è importa quale connessione ha creato la transazione: se è nello stato PREPARED, viene visualizzata. Ma questo non significa che una connessione possa effettuare il commit o annullare una transazione che è stata avviata da un'altra connessione. Si noti che le transazioni che utilizzano il commit commit a una fase non sono mai nello stato PREPARED, perciò non possono essere mostrate da XA RECOVER.

XA RECOVER restituisce quattro colonne:

XA RECOVER;
+----------+--------------+--------------+------+
| formatID | gtrid_length | bqual_length | data |
+----------+--------------+--------------+------+
|        1 |            4 |            0 | test |
+----------+--------------+--------------+------+

formatID è la parte formatID dello xid.

data sono le parti gtrid e bqual dello xid, concatenate.

gtrid_length e bqual_length sono le lunghezze di gtrid e bqual, rispettivamente.

Esempi

Commit a 2 fasi:

XA START 'test';

INSERT INTO t VALUES (1,2);

XA END 'test';

XA PREPARE 'test';

XA COMMIT 'test';

Commit a 1 fase:

XA START 'test';

INSERT INTO t VALUES (1,2);

XA END 'test';

XA COMMIT 'test' ONE PHASE;

Commenti

Sto caricando i commenti......
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.