[sql] 주요 SQL 데이터베이스에서 CREATE TABLE 및 ALTER TABLE 문을 롤백 할 수 있습니까?

DDL을 발행하는 프로그램을 작업 중입니다. CREATE TABLE유사한 DDL을 롤백 할 수 있는지 알고 싶습니다 .

  • Postgres
  • MySQL
  • SQLite

각 데이터베이스가 DDL로 트랜잭션을 처리하는 방법을 설명하십시오.



답변

http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis 는 PostgreSQL의 관점에서이 문제에 대한 개요를 제공합니다.

이 문서에 따르면 DDL 트랜잭션이 있습니까?

  • PostgreSQL-예
  • MySQL-아니요; DDL로 인해 암시 적 커밋이 발생합니다.
  • Oracle Database 11g Release 2 이상-기본적으로 아니요,하지만 에디션 기반 재정의라는 대안이 있습니다.
  • 이전 버전의 Oracle-아니요; DDL로 인해 암시 적 커밋이 발생합니다.
  • SQL Server-예
  • Sybase Adaptive Server-예
  • DB2-예
  • Informix-예
  • Firebird (Interbase)-예

SQLite는 트랜잭션 DDL도 가지고있는 것으로 보입니다. SQLite ROLLBACK에서 CREATE TABLE성명서를 작성할 수있었습니다 . 그 CREATE TABLE문서에는 특별한 트랜잭션 ‘gotchas’가 언급되어 있지 않습니다.


답변

PostgreSQL에는 대부분의 데이터베이스 개체 (확실히 데이터베이스, 사용자가 아닌 테이블, 인덱스 등)에 대한 트랜잭션 DDL이 있습니다. 그러나 실제로 모든 DDL은 ACCESS EXCLUSIVE대상 개체에 대한 잠금을 가져와 DDL 트랜잭션이 완료 될 때까지 완전히 액세스 할 수 없게됩니다. 또한 모든 상황이 제대로 처리되지는 않습니다. 예를 들어 foo다른 트랜잭션이 테이블 을 삭제하고 대체 테이블을 생성하는 동안 테이블에서 선택하려고 foo하면 차단 된 트랜잭션이 새 foo테이블을 찾는 대신 마침내 오류를 받게됩니다 . (편집 : 이것은 PostgreSQL 9.3 이전에 수정되었습니다.)

CREATE INDEX ... CONCURRENTLY 예외적으로 3 개의 트랜잭션을 사용하여 테이블에 인덱스를 추가하는 동시에 동시 업데이트를 허용하므로 트랜잭션에서 자체적으로 수행 할 수 없습니다.

또한 데이터베이스 유지 관리 명령 VACUUM은 트랜잭션에서 사용할 수 없습니다.


답변

엄격히 말해서 “롤백”은 아니지만 Oracle에서 FLASHBACK 명령을 사용하여 데이터베이스가이를 지원하도록 구성된 경우 이러한 유형의 변경을 취소 할 수 있습니다.


답변

다른 답변은 꽤 오래된 것 같습니다.

2019 년 현재 :

  • Postgres는 많은 릴리스에 대해 트랜잭션 DDL을 지원했습니다.
  • SQLite는 많은 릴리스에서 트랜잭션 DDL을 지원했습니다.
  • MySQL은 2018 년에 출시 된 8.0부터 Atomic DDL 을 지원했습니다 .

답변

MySQL로는 할 수 없습니다 . 매우 멍청한 것처럼 보이지만 사실입니다 … (허용되는 답변에 따라)

“InnoDB의 CREATE TABLE 문은 단일 트랜잭션으로 처리됩니다. 이는 사용자의 ROLLBACK이 해당 트랜잭션 중에 사용자가 만든 CREATE TABLE 문을 실행 취소하지 않음을 의미합니다.”

https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

몇 가지 다른 방법을 시도했지만 단순히 롤백되지 않습니다 ..

해결 방법은 단순히 실패 플래그를 설정하고 쿼리 중 하나가 실패한 경우 “drop table tblname”을 수행하는 것입니다.


답변