sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Postgres admite transacciones anidadas o autónomas?

Postgres admite transacciones anidadas, pero difieren del SQL convencional, más como transacciones con puntos parciales anidados.

En el nivel superior, siempre tiene su típico BEGIN/COMMIT/ROLLBACK , y en niveles anidados tienes que usar los siguientes comandos:

  • SAVEPOINT name - crea un nuevo punto de guardado, con un nombre único para la transacción
  • RELEASE SAVEPOINT name - confirma el punto de guardado, aunque solo persistirá si la transacción contenedora se confirma
  • ROLLBACK TO SAVEPOINT name - revierte el punto de guardado

También tendría que asegurarse de que:

  • Los nombres usados ​​para cada SAVEPOINT son únicos;
  • Fallo en un SAVEPOINT se propaga hacia arriba hasta el nivel superior.

La última parte es un poco complicada, a menos que use una biblioteca que pueda hacerlo por usted automáticamente.

Cuando escribí pg-promise, me aseguré de que esas dos disposiciones estuvieran garantizadas:

  • Genera nombres de puntos de guardado automáticamente, como level_1 , level_2 , y así sucesivamente, según el nivel de transacción;
  • Se ejecuta conteniendo ROLLBACK TO SAVEPOINT name , más el ROLLBACK de nivel superior en caso de que falle una transacción secundaria, todo basado en la lógica estándar de encadenamiento de promesas.

Vea también las limitaciones de las transacciones anidadas de PostgreSQL explicadas...