Transazioni XA

Stai visualizzando una vecchia versione di questo article. Visualizza la versione più recente.

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

The XA RECOVER statements shows information about all transactions which are in the PREPARED state. It does not matter which connection created the transaction: if it has been PREPARED, it appears. But this does not mean that a connection can commit or rollback a transaction which was started by another connection. Note that transactions using a 1-phase commit are never in the PREPARED state, so they cannot be showed by XA RECOVER.

XA RECOVER produces four columns:

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

formatID is the formatID part of xid.

data are the gtrid and bqual parts of xid, concatenated.

gtrid_length and bqual_length are the lengths of gtrid and bqual, respectevely.

Examples

2-phases commit:

XA START 'test';

INSERT INTO t VALUES (1,2);

XA END 'test';

XA PREPARE 'test';

XA COMMIT 'test';

1-phase commit:

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.