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.
sql
transactions
ddl
create-table
joeforker
fuente
fuente
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
unaCREATE TABLE
declaración en SQLite. SuCREATE TABLE
documentación no menciona ningún error transaccional especial.fuente
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 tablafoo
mientras otra transacción la elimina y crea una tabla de reemplazofoo
, la transacción bloqueada finalmente recibirá un error en lugar de encontrar la nuevafoo
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.fuente
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.
fuente
Parece que las otras respuestas están bastante desactualizadas.
A partir de 2019:
fuente
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)
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.
fuente