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.

  • If two BEGIN statements in a row are executed (within the same scope), the second one is ignored. For example, in the following code, the second and third BEGINs have no effect; the existing open transaction continues.

    begin;
    begin;    -- Ignored!
    insert into table1 ...;
    begin;    -- Ignored!
    insert into table2 ...;
    commit;
    

    Les règles peuvent être plus complexes si vous utilisez des transactions autonomes scopées et des procédures stockées .

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 |
+-------------------------------+