2012-08-24 5 views
8

Hãy xem xét các truy vấn sau đây thực hiện trong PostgreSQL 9.1 (hoặc 9.2):Có thể sửa đổi giá trị đồng thời tác động đến lựa chọn duy nhất trong PostgreSQL 9.1 không?

SELECT * FROM foo WHERE bar = true 

Giả sử đó là một truy vấn chạy khá dài (ví dụ tham gia một phút).

Nếu ở đầu truy vấn có 5 triệu bản ghi giữ bar = true và trong truy vấn này trong giao dịch khác có hàng được thêm vào và xóa trong bảng foo và đối với một số cập nhật hàng hiện tại được thực hiện cho bar cánh đồng.

Liệu điều này có ảnh hưởng đến kết quả của truy vấn chọn được hiển thị ở trên không?

Tôi biết về cách ly giao dịch và khả năng hiển thị giữa các câu lệnh riêng lẻ trong một giao dịch duy nhất, nhưng điều gì về một câu lệnh đang chạy?

Trả lời

10

số
Do mô hình MVCC chỉ tuples có thể nhìn thấy ở truy vấn bắt đầu sẽ được sử dụng trong một đơn SELECT. Chi tiết trong hướng dẫn sử dụng here:

Đọc Cam kết là mức cách ly mặc định trong PostgreSQL. Khi giao dịch sử dụng mức cách ly này, truy vấn SELECT (không có mệnh đề FOR ​​ CẬP NHẬT/SHARE) chỉ thấy dữ liệu được cam kết trước khi truy vấn bắt đầu; nó không bao giờ thấy dữ liệu không cam kết hoặc thay đổi được cam kết trong khi thực hiện truy vấn giao dịch đồng thời. Thực tế, truy vấn SELECT thấy ảnh chụp nhanh của cơ sở dữ liệu kể từ khi truy vấn bắt đầu chạy. Tuy nhiên, SELECT không thấy ảnh hưởng của các bản cập nhật trước được thực thi trong giao dịch của chính nó, mặc dù chúng chưa được cam kết. Cũng lưu ý rằng hai lệnh SELECT liên tiếp có thể thấy dữ liệu khác nhau, mặc dù chúng nằm trong một giao dịch duy nhất, nếu các giao dịch khác cam kết thay đổi trong khi thực thi lệnh SELECT đầu tiên.

Mỏ nhấn mạnh.

5

Truy vấn sẽ là chế độ xem đồng nhất của dữ liệu khi bắt đầu truy vấn. Trong Postgresql, tài liệu về Kiểm soát đồng thời nhiều phiên bản (MVCC) giải thích cách nó được thực hiện (nhiều phiên bản của một bản ghi tồn tại trong bảng). Trong Oracle, Số Thay đổi Trình tự (SCN) được sử dụng cùng với "trước hình ảnh" của dữ liệu đã sửa đổi. Dưới đây là tài liệu cũ, Transaction Processing in Postgresql, với phần "quản lý lưu trữ không ghi đè". Nhưng hãy xem MVCC.

Hoặc đọc chương trên MVCC trong tài liệu Postgresql