Tôi có thể chọn dữ liệu được chèn trong cùng một giao dịch không được cam kết không?


21

Có lẽ đây là một câu hỏi ngớ ngẩn cho người mới bắt đầu, nhưng tôi không thể tìm thấy câu trả lời ở bất cứ đâu. Ở mọi nơi tôi đọc về việc Transaction Isolationgiải quyết khả năng hiển thị dữ liệu trong các giao dịch đồng thời. Mối quan tâm của tôi là hành vi trong một giao dịch duy nhất.

Nếu tôi bắt đầu một giao dịch, chèn một số dữ liệu, tôi sẽ có thể chọn chúng ngay sau đó - vẫn trong cùng một giao dịch, chưa được cam kết? Nếu có, hành vi này có thể được thay đổi theo cách tương tự như Cách ly giao dịch được đề cập trong trường hợp giao dịch đồng thời không?

Để cụ thể, tôi đang nhắm mục tiêu PostgreQuery 9.4.

Câu trả lời:


17

Vâng.
Mọi thứ bạn đã thực hiện trong cùng một giao dịch đều hiển thị với các lệnh sau trong cùng một giao dịch. Chỉ cần không giao dịch khác cho đến khi cam kết. Điều này đúng cho tất cả các cấp độ cách ly trừ trường Read uncommittedhợp "đọc bẩn" là có thể (nhưng điều đó không ảnh hưởng đến câu hỏi của bạn).

Nó được triển khai với mô hình MVCC (Điều khiển đồng thời đa biến) dựa trên TransactionIdđộ tuổi xác định và mức độ hiển thị cho mỗi hàng của bảng. Mọi phiên bản hàng mới được viết trong cùng một giao dịch đều giống nhau xminvà được coi là đã xảy ra "cùng một lúc".

Có một trường hợp góc cho nhiều CTE (Biểu thức bảng chung) trong cùng một lệnh. Người ta có thể nghĩ rằng những cái đó được thực hiện tuần tự, nhưng trừ khi một CTE tham chiếu thì cái còn lại của chúng là tùy ý. Và tất cả trong số họ nhìn thấy cùng một ảnh chụp nhanh từ khi bắt đầu truy vấn.

Thí dụ:

Ví dụ nâng cao:


3

Hãy thử:

CREATE OR REPLACE FUNCTION public.sp_get_user()
 RETURNS json
 LANGUAGE plpgsql
AS $function$BEGIN

INSERT INTO users (name, password) VALUES ('deadeye', 'test');
RETURN row_to_json(row) FROM (SELECT name, password FROM users WHERE name = 'deadeye') row;

END;$function$

Bây giờ, hãy kiểm tra:

SELECT sp_get_user();
{"name":"deadeye","password":"test"}

Nó hoạt động! Như Erwin đã nói, mọi thứ được thực hiện trong một giao dịch đều hiển thị bên trong giao dịch. Cô lập chỉ là giữa các chủ đề khác nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.