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

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

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

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

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

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

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

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

  • SDK บนอุปกรณ์เคลื่อนที่/เว็บใช้การควบคุมการเกิดขึ้นพร้อมกันอย่างมีประสิทธิภาพ

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

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

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

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

SDK บนอุปกรณ์เคลื่อนที่/เว็บใช้การควบคุมการเกิดขึ้นพร้อมกันอย่างมีประสิทธิภาพ เนื่องจาก 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 จะใช้การควบคุมการเกิดขึ้นพร้อมกันแบบมองโลกในแง่ดีและแง่ลบเพื่อแก้ไขการโต้แย้ง

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

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

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

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