답변:
http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis 는 PostgreSQL의 관점에서이 문제에 대한 개요를 제공합니다.
이 문서에 따르면 DDL 트랜잭션이 있습니까?
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
은 트랜잭션에서 사용할 수 없습니다.
foo
다른 트랜잭션이 삭제되고 다시 생성되는 동안 테이블에서 선택하려고 하면 이전 버전이나 오류에 대해 OK 라고 주장합니다 . 나는 새 버전이 아직 커밋되지 않았기 때문에 괜찮지 않다. 그래서 나는 그것을 보지 말아야한다. 동시 트랜잭션 액세스에서는 어쨌든 트랜잭션을 다시 시작할 준비가되어 있어야하므로 오류가 있어도 괜찮습니다. 필요한 것보다 더 자주 오류가 발생하면 성능이 저하 될 수 있지만 여전히 정확합니다.
다른 답변은 꽤 오래된 것 같습니다.
2019 년 현재 :
START TRANSACTION ... COMMIT;
동일한 트랜잭션에서 후자의 DDL 문이 실패하면 트랜잭션에서 DDL 문을 롤백 할 수 없습니다 . mysql.com/doc/refman/8.0/en/… )
MySQL로는 할 수 없습니다 . 매우 멍청한 것처럼 보이지만 사실입니다 ... (허용되는 답변에 따라)
"InnoDB의 CREATE TABLE 문은 단일 트랜잭션으로 처리됩니다. 이는 사용자의 ROLLBACK이 해당 트랜잭션 중에 사용자가 만든 CREATE TABLE 문을 실행 취소하지 않음을 의미합니다."
https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html
몇 가지 다른 방법을 시도했지만 단순히 롤백되지 않습니다 ..
해결 방법은 단순히 실패 플래그를 설정하고 쿼리 중 하나가 실패한 경우 "drop table tblname"을 수행하는 것입니다.