Estoy trabajando en un programa que emite DDL. Me gustaría saber si CREATE TABLE
un DDL similar se puede revertir
- Postgres
- MySQL
- SQLite
- et al
Describe cómo cada base de datos maneja las transacciones con DDL.
Estoy trabajando en un programa que emite DDL. Me gustaría saber si CREATE TABLE
un DDL similar se puede revertir
Describe cómo cada base de datos maneja las transacciones con DDL.
Respuestas:
http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis proporciona una descripción general de este problema desde la perspectiva de PostgreSQL.
¿Es DDL transaccional de acuerdo con este documento?
SQLite también parece tener DDL transaccional. Pude hacer ROLLBACK
una CREATE TABLE
declaración en SQLite. Su CREATE TABLE
documentación no menciona ningún error transaccional especial.
ALTER TABLE
declaración algo limitada de SQLite también se puede revertir. No se menciona explícitamente en la documentación . Lo que se menciona allí es cómo realizar cambios "avanzados" dentro de una transacción.
PostgreSQL tiene DDL transaccional para la mayoría de los objetos de base de datos (ciertamente tablas, índices, etc. pero no bases de datos, usuarios). Sin embargo, prácticamente cualquier DDL obtendrá un ACCESS EXCLUSIVE
bloqueo en el objeto de destino, haciéndolo completamente inaccesible hasta que finalice la transacción DDL. Además, no todas las situaciones se manejan del todo; por ejemplo, si intenta seleccionar de la tabla foo
mientras otra transacción la elimina y crea una tabla de reemplazo foo
, la transacción bloqueada finalmente recibirá un error en lugar de encontrar la nueva foo
tabla. (Editar: esto se solucionó en o antes de PostgreSQL 9.3)
CREATE INDEX ... CONCURRENTLY
es excepcional, utiliza tres transacciones para agregar un índice a una tabla mientras permite actualizaciones simultáneas, por lo que no se puede realizar en una transacción.
Además, el comando de mantenimiento de la base de datos VACUUM
no se puede utilizar en una transacción.
foo
mientras otra transacción se cae y la recrea, entonces estoy de acuerdo con la versión anterior o el error. No estoy de acuerdo con la nueva versión, porque aún no se ha confirmado, por lo que no debo verla. Estoy de acuerdo con un error, porque en el acceso transaccional concurrente uno debe estar preparado para reiniciar las transacciones de todos modos. Si los errores ocurren con más frecuencia de la necesaria, puede reducir el rendimiento, pero sigue siendo correcto.
Si bien no es estrictamente una "reversión", en Oracle el comando FLASHBACK se puede utilizar para deshacer este tipo de cambios, si la base de datos se ha configurado para admitirlo.
Parece que las otras respuestas están bastante desactualizadas.
A partir de 2019:
START TRANSACTION ... COMMIT;
lo que aún no puede revertir las declaraciones DDL en una transacción si falla la última en la misma transacción (consulte la nota en dev. mysql.com/doc/refman/8.0/en/… )
No se puede hacer con MySQL , parece, muy tonto, pero cierto ... (según la respuesta aceptada)
"La instrucción CREATE TABLE en InnoDB se procesa como una sola transacción. Esto significa que un ROLLBACK del usuario no deshace las declaraciones CREATE TABLE que el usuario hizo durante esa transacción".
https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html
Probé de diferentes maneras y simplemente no se revertirá.
La solución es simplemente establecer una marca de falla y hacer "eliminar tabla tblname" si una de las consultas falla.