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


13

รับระบบซึ่งให้:

  • การควบคุมพร้อมกันในแง่ดีที่สุด / การกำหนดเวอร์ชันต่อวัตถุ (ใช้ CAS - ตรวจสอบและตั้งค่า)
  • ธุรกรรมที่ไม่จำเป็นต้องมีการขยายเพิ่มเติมจากวัตถุเดียว
  • การแยก Snapshot

ระบบนี้ถือว่าเป็นอนุกรมหรือไม่

จากการแยก Snapshot

ในการเขียนที่ผิดปกติธุรกรรมสองรายการ (T1 และ T2) พร้อมกันอ่านชุดข้อมูลที่ทับซ้อนกัน (เช่นค่า V1 และ V2) ทำการอัปเดตร่วมกัน (เช่นอัปเดต T1 V1, อัปเดต V2 V2) และในที่สุดก็กระทำพร้อมกัน การอัปเดตดำเนินการโดยผู้อื่น เป็นระบบที่ต่อเนื่องกันได้ความผิดปกติดังกล่าวจะเป็นไปไม่ได้เนื่องจาก T1 หรือ T2 จะต้องเกิดขึ้น "เป็นครั้งแรก" และจะเห็นได้จากอีกคนหนึ่ง ในทางตรงกันข้ามการแยกสแน๊ปช็อตอนุญาตให้เขียนความผิดปกติได้

เป็นตัวอย่างที่เป็นรูปธรรมลองนึกภาพ V1 และ V2 เป็นสองยอดดุลที่จัดขึ้นโดยบุคคลคนเดียว Phil ธนาคารจะอนุญาตให้ V1 หรือ V2 เรียกใช้การขาดดุลได้หากยอดรวมที่ถืออยู่ในทั้งคู่นั้นไม่เคยติดลบ (เช่น V1 + V2 ≥ 0) ยอดคงเหลือทั้งสองนี้คือ $ 100 Phil เริ่มต้นธุรกรรมสองรายการพร้อมกัน T1 ถอนเงิน 200 ดอลลาร์จาก V1 และ T2 ถอนเงิน 200 ดอลลาร์จาก V2

ตามนี้ดูเหมือนว่ามีศักยภาพในการเขียนเอียงเป็นเหตุผลเดียวสำหรับระบบที่รับประกัน Snapshot Isolation ไม่ใช่ Serializable

อย่างไรก็ตามในระบบที่ไม่อนุญาตให้ทรานแซคชันขยายวัตถุหลาย ๆ อัน (ในตัวอย่างข้างต้น V1 และ V2) ดูเหมือนว่าจะเป็นไปไม่ได้ที่การเขียนแบบเอียงจะเกิดขึ้น

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


1
ฉันคิดว่าคำตอบคือใช่โดยมีเงื่อนไขว่าฐานข้อมูลได้รับอนุญาตให้ยกเลิกการทำธุรกรรมที่จะแนะนำการเขียนแบบเบ้ - หากการทำธุรกรรมถูก จำกัด ให้อ่าน / เขียนวัตถุเดียว
pjc50

2
ฉันคิดว่าคุณจะต้องมีวิธีในการป้องกันการบันทึกที่ซ้ำกันสำหรับการกระทำครั้งแรก ในกรณีนี้ผู้เขียนที่มองโลกในแง่ดีสองคนสามารถเห็นภาพรวมที่ว่างเปล่าและบันทึกนั้นใหม่และคุณสามารถมีวัตถุสองชิ้นได้ที่รุ่น 0
Matthew Mark Miller

คำตอบ:


1

ไม่ฉันไม่คิดว่าข้อกำหนดของคุณส่งผลให้เกิดระบบที่เราควรพิจารณาต่อเนื่อง

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

การแยกสแนปชอตมักใช้งานโดยใช้ MVCC, การควบคุมความสอดคล้องหลายรุ่น MVCC กำหนดรายละเอียดเพิ่มเติมของธุรกรรมในบริบทของสแน็ปช็อตของพวกเขา: มันบอกว่าพวกเขาต้องการการแยกเฉพาะเมื่อเขียนความขัดแย้ง (เฉพาะที่ตั้งหรือที่ตั้ง + ค่าขึ้นอยู่กับการใช้งาน) MVCC ให้รูปแบบความสอดคล้องที่ผ่อนคลายและทนทุกข์ทรมานจากการเขียนเอียง

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

ดังนั้นให้เริ่มด้วยโมเดลการทำงานพร้อมกันอย่างเข้มงวดก่อน ธุรกรรมสองรายการจะต้องแยกออกจากกันหากมีการเขียนไปยังข้อมูลใด ๆ ที่อีกรายการหนึ่งอ่านหรือเขียน (และในทางกลับกัน ... )

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

เราจำเป็นต้องพิจารณาข้อมูลที่ถูกต้องอ่านหรือเขียนโดยการทำธุรกรรมข้อมูลใด ๆ นอกชุดที่ไม่จำเป็นต้องได้รับการพิจารณา อย่างไรก็ตามสิ่งสำคัญคือต้องตระหนักว่าเมื่อเรากำลังพูดถึงข้อมูลที่อ่านโดยธุรกรรมเราจำเป็นต้องมีข้อมูล "meta" ใด ๆ และทั้งหมด (และข้อมูลและข้อมูลเมตาที่อ่านโดยการดำเนินการ meta เช่นการตรวจสอบข้อ จำกัด ) ตัวอย่างของข้อมูลเมตาคือ / การดำเนินการเมตาคือ: การระบุคีย์หลักใหม่ที่ไม่ซ้ำ; อีกอันคือผลรวมของคอลัมน์ทั้งหมด อื่นคือการค้นหาบางสิ่งบางอย่างและไม่พบมัน ค้นหาช่วงหรือจำนวนเงิน สิ่งนี้ไปที่ความคิดเห็นของ @ Matthew เกี่ยวกับการป้องกันการซ้ำซ้อนรวมถึง @Tersosauros คำตอบซึ่งเขาเห็นว่าเป็นของรัฐ

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

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

ความมั่นคงที่ผ่อนคลายเป็นอีกวิธีหนึ่งในการบอกว่าอาจไม่สอดคล้องกันหรือเกิดข้อผิดพลาดได้ง่าย (ความมั่นคงที่ผ่อนคลายไม่ควรสับสนกับความมั่นคงในที่สุดซึ่งเป็นข้อผิดพลาดอีกรูปแบบหนึ่งที่ได้รับความนิยมจาก "NoSQL")

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

อย่างไรก็ตาม ...

ฉันนำมาจากคำถามของคุณว่าคุณกำลังใช้การแยกสแน็ปช็อต (MVCC) กับแต่ละวัตถุ (พูดมากกว่าการล็อควัตถุ) (คุณพูดถึง CAS; ฉันเคยได้ยินเปรียบเทียบและสลับและทดสอบและตั้งค่าแล้ว แต่ไม่ตรวจสอบและตั้งแม้ว่าฉันคิดว่ามันคล้ายกัน)

คำถามของคุณแนะนำให้ฉันเห็นว่า "วัตถุ" มีมากกว่าหนึ่งช่องมิฉะนั้นข้อกำหนดของคำถามจะไม่จำเป็น

ดังนั้นเนื่องจากออบเจ็กต์ snapshott'ed / MVCC ที่จัดการของคุณมีมากกว่าหนึ่งฟิลด์คุณจึงมีแนวโน้มที่จะเขียนความเอียงภายในวัตถุเดียว หากธุรกรรมสองรายการอัปเดตวัตถุเดียวกันในเวลาเดียวกันรายการหนึ่งอาจอ่านฟิลด์ที่มีมูลค่าของวัตถุที่ทำให้เก่าโดยธุรกรรมอื่นที่เกิดขึ้นพร้อมกันบนวัตถุเดียวกันและดำเนินการต่อโดยไม่ทราบดังนั้นจึงอาจเกิดความไม่สอดคล้องกัน

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

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

(เราจำเป็นต้องพิจารณาเฉพาะรายการ / ฟิลด์ที่ถูกต้องและอ่านหรือเขียน แต่เราต้องรวมที่อ่านเป็นข้อมูลเมตาในระหว่างการดำเนินการเมตาเพื่อป้องกันการเขียนเอียง (เช่นข้อผิดพลาด) ถ้าเราลบชุดอ่านทั้งสองจากชุดเปรียบเทียบ หรือเราไม่สามารถพิจารณาข้อมูลเมตา (อาจใช้โดยการดำเนินการเมตา) จากนั้นเรามีโมเดลที่จะอนุญาตให้เกิดข้อผิดพลาด)


0

ฉันคิดว่าตามที่@ pjc50ระบุไว้(เน้นเพิ่ม :) " ถ้าธุรกรรมถูก จำกัด ให้อ่าน / เขียนวัตถุเดียว" จากนั้น "คำตอบคือใช่" อย่างไรก็ตามฉันคิดว่าสิ่งนี้หล่นลงมาอยู่ในความคิดของวัตถุชิ้นเดียว

ในตัวอย่างที่นำมาจากการแยก Snapshot , T1 และ T2 จะไม่แบ่งปันค่าใด ๆ แต่พวกเขายังคงมีศักยภาพสำหรับการเขียนภาพเอียงเพราะเป็น " ค่า [มี] เห็นการปรับปรุงการดำเนินการโดยคนอื่น ๆ " แหล่งที่มา ดังนั้นจึงเป็นความสามารถของการทำธุรกรรมที่จะเห็นการปรับปรุงอื่น ๆ ทั้งหมดก่อนที่จะกระทำที่ทำให้การทำธุรกรรมเป็นอนุกรมอย่างแท้จริง

จากserializability :

Serializability ของกำหนดการหมายถึงความเท่าเทียมกัน (ในผลลัพธ์สถานะฐานข้อมูลค่าข้อมูล) กับกำหนดการอนุกรม (กล่าวคือตามลำดับโดยไม่มีธุรกรรมซ้อนทับในเวลา) ด้วยธุรกรรมเดียวกัน

น่าเสียดายเนื่องจากสิ่งนี้ (และ@Matthew Mark Millerชี้ให้เห็น) เราจึงต้องพิจารณาสถานะและค่าต่างๆด้วย ด้วยการพิจารณานี้สองรายการโดยใช้โอซีซีจะมีศักยภาพในการเขียนเอียงเมื่อใดก็ตามที่รัฐฐานข้อมูลใด ๆ ที่เขียน

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