with sql transactions liquibase

liquibase mysql with sql



¿Liquibase es compatible con el funcionamiento en seco? (3)

Tenemos un par de esquemas de datos e investigamos la migración a Liquibase. (Uno de los esquemas de datos ya se migró a Liquibase).

Una pregunta importante para nosotros es si Liquibase es compatible con la prueba en seco:

  • Necesitamos ejecutar cambios en la base de datos en todos los esquemas sin compromiso para garantizar que no tengamos problemas.
  • En caso de éxito, todos los cambios en la base de datos se ejecutarán una vez más con commit.

(La pregunta es similar a la ejecución en seco de la consulta de SQL Server pero relacionada con Liquibase)

Agregado después de la respuesta

Leo la documentación relacionada con updateSQL y no responde a los requisitos de "ejecución en seco". Simplemente genera el SQL (en la línea de comando, en la tarea Ant y en el complemento Maven). Voy a aclarar mi pregunta:

¿Liquibase respalda el control de las transacciones?

Quiero abrir la transacción antes de ejecutar el registro de cambios de Liquibase y deshacer la transacción después de la ejecución del registro de cambios. Por supuesto, necesito verificar el resultado de la ejecución.

¿Es posible?

Adicional

Sin control en las transacciones (o ejecución en seco) no podemos migrar a Liquibase todos nuestros esquemas.

Por favor ayuda.


Puede probar el modo "updateSQL", conectará db (verifique sus derechos de acceso), adquiera cerradura db, genere / imprima oraciones SQL para aplicar (basado en el estado db y sus conjuntos actuales de cambio de liquibase) también imprimirá la identificación de chageset que falta en el estado actual de db y suelte db lock.


Lamentablemente no.

De forma predeterminada, Liquibase confirma la transacción que ejecuta todas las declaraciones de un conjunto de cambios. Supongo que las rutas de migración que tiene en mente generalmente implican más de un solo conjunto de cambios.

La única manera de modificar el comportamiento de la transacción es el atributo runInTransaction para la etiqueta <changeset> , como se documenta aquí . Al establecerlo en false , efectivamente se desactiva la gestión de transacciones, es decir, habilita el modo de confirmación automática, como se puede ver en ChangeSet.java .

Creo que esta característica podría ser una valiosa adición a Liquibase, así que abrí una solicitud de funciones: CORE-1790 .


Creo que su respuesta es "no admite ejecuciones en seco", pero el problema es principalmente con la base de datos y no con liquibase.

Liquibase ejecuta cada changeSet en una transacción y la compromete después de insertarla en la tabla DATABASECHANGELOG, por lo que en teoría podría anular la lógica de liquibase para retrotraer esa transacción en lugar de comprometerla, pero se encontrará con el problema donde la mayoría de SQL ejecutado por liquibase es automático comprometerse.

Por ejemplo, si tiene un changeSet de:

<changeSet> <createTable name="test"> ... </createTable> </changeSet>

Lo que se ejecuta es:

START TRANSACTION CREATE TABLE NAME ... INSERT INTO DATABASECHANGELOG... COMMIT

pero incluso si cambió el último comando a ROLLBACK, la llamada a la tabla de creación se confirmará automáticamente cuando se ejecute y lo único que realmente se revertirá es el INSERTAR.

NOTA: hay algunas bases de datos que revertirán DDL SQL como postgresql, pero la mayoría no.

Los comandos INSERT / UPDATE se ejecutarían en una transacción y podrían retrotraerse automáticamente al final, pero liquibase no tiene un comando postcondición para realizar la verificación dentro de la transacción del estado que se requeriría. Esa sería una característica útil ( https://liquibase.jira.com/browse/CORE-1793 ) pero incluso no sería utilizable si hay alguna etiqueta de cambio de confirmación automática en el conjunto de cambios. Si agregó una poscondición para crear el ejemplo de tabla anterior, la condición posterior fallaría y la actualización fallaría, pero la tabla aún estaría allí.