ความไม่สอดคล้องกันในการอ่านซ้ำ


10

http://www.postgresql.org/docs/9.2/static/transaction-iso.html

โหมดการอ่านซ้ำจะให้การรับประกันอย่างเข้มงวดว่าแต่ละธุรกรรมจะเห็นมุมมองที่สมบูรณ์ของฐานข้อมูล อย่างไรก็ตามมุมมองนี้จะไม่จำเป็นต้องสอดคล้องกับการดำเนินการอนุกรม (ทีละครั้ง) เสมอของการทำธุรกรรมที่เกิดขึ้นพร้อมกันในระดับเดียวกัน ตัวอย่างเช่นแม้แต่ธุรกรรมแบบอ่านอย่างเดียวในระดับนี้อาจเห็นระเบียนควบคุมที่อัปเดตเพื่อแสดงว่าแบทช์เสร็จสมบูรณ์แล้ว แต่ไม่เห็นหนึ่งในบันทึกรายละเอียดซึ่งเป็นส่วนหนึ่งในเชิงตรรกะของแบทช์เพราะอ่านการแก้ไขเรคคอร์ดควบคุมก่อนหน้านี้ . ความพยายามในการบังคับใช้กฎเกณฑ์ทางธุรกิจโดยธุรกรรมที่ทำงานในระดับการแยกนี้ไม่น่าจะทำงานได้อย่างถูกต้องโดยไม่ต้องใช้การล็อคอย่างชัดเจนเพื่อป้องกันการทำธุรกรรมที่ขัดแย้งกัน

นั่นไม่ใช่ phantom read ซึ่งเป็นไปไม่ได้ในโหมดอ่านซ้ำ

เอกสารระบุว่าแบบสอบถามในธุรกรรมอ่านซ้ำสามารถดูสแน็ปช็อตเมื่อเริ่มต้นธุรกรรมจากนั้นจึงเป็นไปได้อย่างไรที่แบบสอบถามจะอ่านข้อมูลที่ไม่สอดคล้องกัน

คำตอบ:


5

นี่คือการอ่านของฉันของส่วนนั้น ฉันจะยอมรับว่ามันสับสน

สมมติว่าฉันมีสองตาราง:

CREATE TABLE batch (
   id serial not null unique,
   control_code text primary key,
   date_posted date not null default now()
);

CREATE TABLE details (
   batch_id int not null references batch(id),
   description text,
   primary key(batch_id, description)
);

ทีนี้สมมติว่าเราใส่ชุดและบันทึกรายละเอียดในการทำธุรกรรมที่แตกต่างกัน เซสชัน 1 แทรกแบตช์และเริ่มแทรกรายละเอียด แต่ก่อนที่จะเสร็จสิ้นเซสชัน 2 จะเริ่มขึ้น เซสชัน 2 จะได้เห็นข้อมูลส่วนหัวของชุดงาน แต่ไม่ต้องรอรายละเอียดการมอบหมายเพื่อแจ้งผู้ใช้ว่าไม่พบระเบียน ตอนนี้ถ้าแบทช์และรายละเอียดของคุณอยู่ในการทำธุรกรรมเดียวกันทั้งหมดนี้ไม่เคยมีปัญหา

สิ่งนี้จะแตกต่างจากอนุกรมที่คุณคาดว่าจะรอให้การแทรกก่อนหน้านี้เสร็จสมบูรณ์และกระทำหรือย้อนกลับก่อนที่จะพิจารณาว่าจะแจ้งเตือนผู้ใช้ว่าไม่พบแถว


3

มีเอกสารใน PostgreSQL Wiki ที่แสดงปัญหาบางอย่างซึ่งอาจเกิดขึ้นกับการรวมธุรกรรมบางอย่างในระดับการแยกธุรกรรม REPEATABLE READ และวิธีการหลีกเลี่ยงที่ระดับการแยกธุรกรรม SERIALIZABLE เริ่มต้นด้วย PostgreSQL รุ่น 9.1

นอกจากนี้ยังมีตัวอย่างของวิธีการที่เป็นไปได้สำหรับธุรกรรม REPEATABLE READ-READ ระดับเดียวเพื่ออ่านข้อมูลที่ไม่สอดคล้องกัน


@dezso คุณอาจสนใจ
907th

1

Phantom reads (ต้องแน่ใจว่าไม่สับสนกับการอ่านที่ไม่สามารถทำซ้ำได้) เป็นไปได้ในระดับการแยก "ซ้ำอ่าน" ในหลักการ แต่ Postgresql de-พฤตินัยพฤติกรรมเมื่อคุณเลือก "อ่านซ้ำ" ได้ดีกว่ามาตรฐาน (แยกเกือบ "Serializable") ดังนั้นตามความเป็นจริงคุณจะไม่ได้อ่านผี เอกสาร :

เมื่อคุณเลือกระดับ Read Uncommitted คุณจะได้รับ Read Committed จริงๆและ phantom reads เป็นไปไม่ได้ในการนำ PostgreSQL ไปใช้ของ Repeatable Readดังนั้นระดับการแยกที่แท้จริงอาจเข้มงวดกว่าที่คุณเลือก

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

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