2011-01-14 22 views

Trả lời

107

http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis cung cấp tổng quan về vấn đề này từ quan điểm của PostgreSQL.

Giao dịch DDL có theo tài liệu này không?

  • PostgreSQL - có
  • MySQL - không có; DDL gây ra cam kết tiềm ẩn
  • Cơ sở dữ liệu Oracle 11g Bản phát hành 2 trở lên - theo mặc định, không, nhưng thay thế được gọi là định nghĩa lại dựa trên phiên bản tồn tại
  • Phiên bản cũ hơn của Oracle - no; DDL gây ra ngầm cam kết
  • SQL Server - có
  • Sybase Adaptive Server - có
  • DB2 - có
  • Informix - có
  • Firebird (Interbase) - có

SQLite cũng xuất hiện cũng có DDL giao dịch. Tôi đã có thể ROLLBACK một tuyên bố CREATE TABLE trong SQLite. Tài liệu CREATE TABLE của nó không đề cập đến bất kỳ giao dịch 'gotchas' đặc biệt nào.

+5

Tuy nhiên, trình điều khiển Python mặc định cho sqlite ngăn SQL giao dịch. http://bugs.python.org/issue10740 – joeforker

+0

Vì vậy, câu trả lời là "Có, chúng có thể được khôi phục, trừ khi bạn đang sử dụng MySQL hoặc các phiên bản cũ hơn của Oracle." – rjmunro

+0

Không, có các cơ sở dữ liệu SQL khác ngoài các cơ sở dữ liệu được liệt kê. – joeforker

3

Trong khi nó không nghiêm chỉnh nói "rollback", trong Oracle lệnh FLASHBACK có thể được sử dụng để hoàn tác các loại thay đổi này, nếu cơ sở dữ liệu đã được cấu hình để hỗ trợ nó.

19

PostgreSQL có DDL giao dịch cho hầu hết các đối tượng cơ sở dữ liệu (chắc chắn bảng, chỉ mục, vv nhưng không phải cơ sở dữ liệu, người dùng). Tuy nhiên thực tế bất kỳ DDL sẽ nhận được một khóa ACCESS EXCLUSIVE trên đối tượng mục tiêu, làm cho nó hoàn toàn không thể tiếp cận cho đến khi giao dịch DDL kết thúc. Ngoài ra, không phải tất cả các tình huống đều được xử lý - ví dụ, nếu bạn cố gắng chọn từ bảng foo trong khi giao dịch khác đang xóa và tạo bảng thay thế foo thì giao dịch bị chặn cuối cùng sẽ nhận được lỗi thay vì tìm bảng foo mới. (Chỉnh sửa: điều này đã được sửa trong hoặc trước PostgreSQL 9.3)

CREATE INDEX ... CONCURRENTLY là đặc biệt, nó sử dụng ba giao dịch để thêm chỉ mục vào bảng đồng thời cho phép cập nhật đồng thời.

Ngoài ra, lệnh bảo trì cơ sở dữ liệu VACUUM không thể được sử dụng trong giao dịch.

+0

+1 cho thông tin 'ACCESS EXCLUSIVE'! –

+0

Tôi cho rằng nếu tôi thử để chọn từ bảng 'foo' trong khi một giao dịch khác đang giảm và tạo lại nó, thì tôi là OK ith phiên bản cũ hoặc lỗi. Tôi không đồng ý với phiên bản mới, bởi vì nó chưa được cam kết, vì vậy tôi không được nhìn thấy nó. Tôi OK với một lỗi, bởi vì trong một trong những giao dịch truy cập đồng thời phải được chuẩn bị sẵn sàng để khởi động lại giao dịch anyway. Nếu lỗi xảy ra thường xuyên hơn mức cần thiết, nó có thể làm giảm hiệu suất, nhưng nó vẫn chính xác. –

+0

@JanHudec: bạn sẽ không nhìn thấy phiên bản không được cam kết của bảng mới, chỉ là kết quả của toàn bộ giao dịch đã giảm/tạo lại nó. tức là một giao dịch giảm, tái tạo và repopulates một bảng có hiệu quả nguyên tử wrt các quá trình khác lựa chọn từ bảng đó. (nhưng mọi thứ sẽ bị chặn ngay sau khi họ thậm chí cố gắng đọc lược đồ của bảng) – araqnid

0

Không thể được thực hiện với MySQL có vẻ như, rất câm ..

"Câu lệnh CREATE TABLE trong InnoDB được xử lý như một giao dịch duy nhất.Điều này có nghĩa rằng một ROLLBACK từ người dùng không undo CREATE TABLE báo cáo người sử dụng thực hiện trong giao dịch đó."

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

thử một vài cách khác nhau và nó chỉ đơn giản là sẽ không quay trở lại ..

Làm việc xung quanh là chỉ cần đặt cờ thất bại và thực hiện "drop table tblname" nếu một trong các truy vấn không thành công ..

Các vấn đề liên quan