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;