ความสามารถในการเรียงลำดับและการแยกธุรกรรม

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

ธุรกรรมและการแย่งชิงข้อมูล

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

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

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

ABORTED: Too much contention on these documents. Please try again.

เมื่อตัดสินใจว่าการดำเนินการใดจะดำเนินการไม่สำเร็จหรือล่าช้า ลักษณะการทำงานจะขึ้นอยู่กับประเภทของไลบรารีไคลเอ็นต์

  • SDK บนอุปกรณ์เคลื่อนที่/เว็บใช้การควบคุมการทํางานพร้อมกันแบบมองโลกในแง่ดี

  • ไลบรารีของไคลเอ็นต์เซิร์ฟเวอร์ใช้การควบคุมการเรียกใช้พร้อมกันแบบมองโลกในแง่ร้าย

การแย่งกันใช้ข้อมูลใน SDK บนอุปกรณ์เคลื่อนที่/เว็บ

SDK บนอุปกรณ์เคลื่อนที่/เว็บ (แพลตฟอร์ม Apple, Android, เว็บ, C++) ใช้การควบคุมการทํางานพร้อมกันแบบมองโลกในแง่ดีเพื่อแก้ไขการแย่งกันใช้ข้อมูล

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

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

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

การแย่งกันใช้ข้อมูลในไลบรารีของไคลเอ็นต์เซิร์ฟเวอร์

ไลบรารีของไคลเอ็นต์เซิร์ฟเวอร์ (C#, Go, Java, Node.js, PHP, Python, Ruby) ใช้การควบคุมการเรียกใช้พร้อมกันแบบแย่งกันใช้เพื่อแก้ไขการแย่งกันใช้ข้อมูล

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

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

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

เมื่อธุรกรรมล็อกเอกสารไว้ การดำเนินการเขียนอื่นๆ จะต้องรอให้ธุรกรรมนั้นเลิกล็อก ธุรกรรมจะได้รับการล็อกตามลําดับเวลา

การแยกระดับที่แยกแยะได้

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

  • ธุรกรรมต้องใช้ข้อมูลที่ถูกต้องและสอดคล้องกัน
  • ฐานข้อมูลจะดำเนินการพร้อมกันเพื่อใช้ทรัพยากรอย่างมีประสิทธิภาพ

ในระบบที่มีระดับการแยกระดับต่ำ การดำเนินการอ่านภายในธุรกรรมอาจอ่านข้อมูลที่ไม่ถูกต้องจากการเปลี่ยนแปลงที่ยังไม่ได้บันทึกในการดำเนินการพร้อมกัน

การแยกระดับที่แยกได้จะกำหนดระดับการแยกสูงสุด การแยกระดับแบบจัดเก็บได้หมายความว่า

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

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

Cloud Firestore รับประกันการแยกธุรกรรมที่อนุกรมเวลาได้ ธุรกรรมใน Cloud Firestore จะจัดเรียงตามลําดับและแยกตามเวลาทําการ

การแยกส่วนที่แยกแยะได้ตามเวลาคอมมิต

Cloud Firestore จะกําหนดเวลาคอมมิตให้กับธุรกรรมแต่ละรายการ ซึ่งแสดงถึงจุดหนึ่งๆ ในช่วงเวลา เมื่อ Cloud Firestore บันทึกการเปลี่ยนแปลงของธุรกรรมลงในฐานข้อมูล คุณสามารถถือว่าการอ่านและการเขียนทั้งหมดภายในธุรกรรมเกิดขึ้นในเวลาที่บันทึก

การดำเนินการธุรกรรมจริงต้องใช้เวลาสักระยะ การดำเนินการธุรกรรมจะเริ่มขึ้นก่อนเวลาคอมมิต และการดําเนินการหลายรายการอาจทับซ้อนกัน Cloud Firestore รักษาการแยกที่อนุมานได้ และรับประกันว่า

  • Cloud Firestore บันทึกธุรกรรมตามลำดับตามเวลาที่บันทึก
  • Cloud Firestore แยกธุรกรรมออกจากการดำเนินการพร้อมกันที่มีเวลาคอมมิตในภายหลัง

ในกรณีที่มีการแย่งกันใช้ข้อมูลระหว่างการดำเนินการพร้อมกัน Cloud Firestore จะใช้การควบคุมการทํางานพร้อมกันแบบมองโลกในแง่ดีและมองโลกในแง่ร้ายเพื่อแก้ไขการแย่งกันใช้ข้อมูล

การแยกภายในธุรกรรม

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

ปัญหาเกี่ยวกับการแย่งกันใช้ข้อมูล

ดูข้อมูลเพิ่มเติมเกี่ยวกับการแย่งกันใช้ข้อมูลและวิธีแก้ปัญหาได้ที่หน้าการแก้ปัญหา