2012-11-19 35 views
5

Tôi biết rằng trong các câu lệnh ddl MySQL như thay đổi bảng/tạo bảng/etc gây ra một giao dịch ngầm định cam kết.Có thể bọc các thay đổi DDL trong một giao dịch trong PostgreSQL không?

Khi chúng tôi chuyển sang PostgreSQL, có thể bao bọc nhiều số liệu DDL trong một giao dịch không?

Điều này sẽ làm cho tập lệnh di chuyển mạnh mẽ hơn nhiều, thay đổi DDL không thành công sẽ khiến mọi thứ quay trở lại.

Trả lời

10

Tuyên bố DDL được đề cập trong các giao dịch. Tôi không thể tìm thấy phần liên quan trong tài liệu chính thức, nhưng đã cung cấp liên kết đến wiki bao gồm nó.

Chỉ cần nhớ rằng các giao dịch không được tự động mở trong postgresql, bạn phải bắt đầu chúng với BEGIN hoặc START TRANSACTION.

Postgresql Wiki about Transactional DDL

+5

Tôi không nghĩ rằng có một chương đặc biệt về DDL giao dịch trong hướng dẫn sử dụng. Nếu tôi không nhầm, bạn có thể giả định mọi tuyên bố sẽ được giao dịch ** trừ khi ** được nêu khác đi. Vì vậy, hướng dẫn sẽ chỉ ghi lại những tài liệu không giao dịch (ví dụ: 'tạo cơ sở dữ liệu') –

8

Không phải mọi tuyên bố Postgres DDL có thể được bọc trong giao dịch. Các câu lệnh như DROP DATABASE/DROP TABLESPACE và một số rollback liên quan đến hệ thống tệp khác.

Ngoài ra:

ALTER TYPE ... Thêm giá trị (dưới hình thức có thêm một giá trị mới cho một enum loại) không thể được thực hiện bên trong một khối giao dịch.

Ngoài ra một số câu như TRUNCATE là 'không lưu MVCC'. Các thay đổi được thực hiện bởi loại câu lệnh đó có thể ảnh hưởng đến các truy vấn khác, ngay cả khi chúng được khôi phục.

Vì vậy, hãy đọc hướng dẫn chính thức cho phiên bản bưu chính của bạn để tìm hiểu xem DDL của bạn có giao dịch an toàn hay không.

+1

Vấn đề' TRUNCATE' vẫn đúng trong 9.2, ít nhất là theo tài liệu. http://www.postgresql.org/docs/current/static/sql-truncate.html. Khá nhiều thứ ngoại trừ việc tạo/thả DB và 'TRUNCATE' là giao dịch an toàn. –

+1

Và còn 'DROP TABLESPACE' thì sao? Theo http://stackoverflow.com/questions/1108749/limits-on-postgresql-schema-changes-inside-transactions?rq=1 nó không an toàn (hoặc không an toàn). –

+0

Làm rõ quan trọng. cắt ngắn giao dịch IS an toàn, nó không phải là MVCC an toàn. –