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

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

การแย่งกันเข้าถึงธุรกรรมและข้อมูล

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

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

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

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

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

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