ฉันสามารถเลือกข้อมูลที่ถูกแทรกในการทำธุรกรรมที่ไม่มีข้อผูกมัดเดียวกันได้หรือไม่?


21

อาจเป็นคำถามเริ่มต้นที่โง่ แต่ฉันไม่สามารถหาคำตอบได้ทุกที่ ทุกที่ที่ฉันอ่านเกี่ยวกับสิ่งTransaction Isolationที่แก้ปัญหาการเปิดเผยข้อมูลภายในธุรกรรมที่เกิดขึ้นพร้อมกัน ความกังวลของฉันคือพฤติกรรมภายในธุรกรรมเดียว

หากฉันเริ่มต้นธุรกรรมให้แทรกข้อมูลบางส่วนฉันจะสามารถเลือกได้ทันที - ยังคงอยู่ในการทำธุรกรรมเดียวกัน ถ้าใช่พฤติกรรมนี้สามารถเปลี่ยนแปลงได้ในลักษณะเดียวกันเช่นแยกธุรกรรมที่กล่าวถึงในกรณีของการทำธุรกรรมพร้อมกัน?

จะเจาะจงฉันกำลังกำหนดเป้าหมาย PostgreSQL 9.4

คำตอบ:


17

ใช่.
ทุกสิ่งที่คุณทำในการทำธุรกรรมเดียวกันจะปรากฏให้เห็นคำสั่งในภายหลังในการทำธุรกรรมเดียวกัน อย่าเพิ่งทำธุรกรรมอื่น ๆ จนกว่าจะทำ สิ่งนี้เป็นจริงสำหรับทุกระดับการแยกยกเว้นRead uncommittedที่เป็นไปได้ "อ่านสกปรก" เป็นไปได้ (แต่นั่นไม่ส่งผลกระทบต่อคำถามของคุณต่อ se)

มันนำมาใช้กับรูปแบบ MVCC (การควบคุมภาวะพร้อมกันหลายอย่าง)ตามการTransactionIdกำหนดอายุและการมองเห็นสำหรับทุกแถวของตาราง แถวใหม่ทุกเวอร์ชันที่เขียนในธุรกรรมเดียวกันจะได้รับเหมือนกันxminและถือว่าเกิดขึ้น "พร้อมกัน"

มีตัวเรือนมุมสำหรับหลายCTE (Common Table Expression)ในคำสั่งเดียวกัน หนึ่งอาจคิดว่าพวกเขาจะดำเนินการตามลำดับ แต่ถ้า CTE หนึ่งอ้างอิงลำดับอื่น ๆ ของพวกเขาโดยพลการ และพวกเขาทั้งหมดเห็นภาพรวมเดียวกันจากจุดเริ่มต้นของแบบสอบถาม

ตัวอย่าง:

ตัวอย่างขั้นสูง:


3

มาลองกัน :

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$

ตอนนี้มาทดสอบกัน:

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

มันได้ผล ! ดังที่เออร์วินกล่าวว่าทุกสิ่งที่ทำในธุรกรรมสามารถมองเห็นได้ภายในธุรกรรม การแยกอยู่ระหว่างเธรดที่ต่างกันเท่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.