Catégories :

Transactions

BEGIN

Commence une transaction dans la session en cours.

START TRANSACTION est un synonyme de BEGIN.

Voir aussi :

COMMIT , ROLLBACK , SHOW TRANSACTIONS

Syntaxe

BEGIN [ { WORK | TRANSACTION } ] [ NAME <name> ]

START TRANSACTION [ NAME <name> ]

Paramètres

WORK | TRANSACTION

Mots clés facultatifs qui assurent la compatibilité avec d’autres systèmes de bases de données.

NAME nom

Chaîne facultative qui attribue un nom à la transaction. Un nom aide à identifier une transaction, mais n’est pas requis et n’a pas besoin d’être unique.

Notes sur l’utilisation

  • Toutes les transactions ont un ID interne généré par le système, qui correspond à l’horodatage (en millisecondes) lorsque la transaction a commencé.

  • Si vous spécifiez un nom pour une transaction, le mot clé NAME est requis.

  • Si aucun nom n’est spécifié, un nom généré par le système est affecté à la transaction.

  • Pour terminer une transaction, une commande COMMIT ou ROLLBACK doit être explicitement exécutée. Tant qu’une de ces commandes n’est pas exécutée, la transaction reste ouverte.

  • Lorsqu’une instruction SQL interroge un flux dans une transaction explicite, le flux est interrogé au point d’avance du flux (c’est-à-dire l’horodatage) lorsque la transaction a commencé plutôt que lorsque l’instruction a été exécutée. Ce comportement concerne à la fois les instructions DML et CREATE TABLE … AS SELECT (CTAS) qui remplissent une nouvelle table avec des lignes d’un flux existant.

Exemples

Note

Ces exemples ne comprennent pas les commandes nécessaires pour effectuer les transactions. Pour des exemples de transactions complètes, voir COMMIT ou ROLLBACK.

Commencer une transaction :

BEGIN;

SHOW TRANSACTIONS;

+---------------+--------+--------------+--------------------------------------+-------------------------------+---------+
|            id | user   |      session | name                                 | started_on                    | state   |
|---------------+--------+--------------+--------------------------------------+-------------------------------+---------|
| 1530042321085 | USER1  | 223347060798 | 56cb9163-77a3-4223-b3e0-aa24a20540a3 | 2018-06-26 12:45:21.085 -0700 | running |
+---------------+--------+--------------+--------------------------------------+-------------------------------+---------+

SELECT CURRENT_TRANSACTION()

+-----------------------+
| CURRENT_TRANSACTION() |
|-----------------------|
| 1530042321085         |
+-----------------------+

Notez le nom attribué par le système, 56cb9163-77a3-4223-b3e0-aa24a20540a3, pour la transaction.

Commencez une transaction avec un nom spécifié :

BEGIN NAME T1;

SHOW TRANSACTIONS;

+---------------+--------+--------------+------+-------------------------------+---------+
|            id | user   |      session | name | started_on                    | state   |
|---------------+--------+--------------+------+-------------------------------+---------|
| 1530042377426 | USER1  | 223347060798 | T1   | 2018-06-26 12:46:17.426 -0700 | running |
+---------------+--------+--------------+------+-------------------------------+---------+

SELECT CURRENT_TRANSACTION();

+-----------------------+
| CURRENT_TRANSACTION() |
|-----------------------|
| 1530042377426         |
+-----------------------+

Même exemple que l’exemple précédent, mais en utilisant START TRANSACTION au lieu de BEGIN :

START TRANSACTION NAME T2;

SHOW TRANSACTIONS;

+---------------+--------+--------------+------+-------------------------------+---------+
|            id | user   |      session | name | started_on                    | state   |
|---------------+--------+--------------+------+-------------------------------+---------|
| 1530042467963 | USER1  | 223347060798 | T2   | 2018-06-26 12:47:47.963 -0700 | running |
+---------------+--------+--------------+------+-------------------------------+---------+

SELECT CURRENT_TRANSACTION();

+-----------------------+
| CURRENT_TRANSACTION() |
|-----------------------|
| 1530042467963         |
+-----------------------+

Dans les trois exemples, notez que la fonction CURRENT_TRANSACTION renvoie la transaction ID (c’est-à-dire, l’heure de début de la transaction en millisecondes).

Toute fonction exécutée sur l’horodatage/ID doit spécifier l’échelle appropriée. Par exemple :

SELECT CURRENT_TRANSACTION();

+-----------------------+
| CURRENT_TRANSACTION() |
|-----------------------|
| 1530042467963         |
+-----------------------+

SELECT TO_TIMESTAMP_LTZ(1530042467963, 3) AS transaction_timestamp;

+-------------------------------+
| TRANSACTION_TIMESTAMP         |
|-------------------------------|
| 2018-06-26 12:47:47.963 -0700 |
+-------------------------------+