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

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

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

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

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

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 ใช้การควบคุมการเกิดขึ้นพร้อมกันแบบในแง่บวกและแง่ลบเพื่อแก้ไขการช่วงชิง

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

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

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

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