- Catégories :
BEGIN¶
Commence une transaction dans la session en cours.
START TRANSACTION est un synonyme de BEGIN.
- Voir aussi :
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 | +-------------------------------+