การทำให้เป็นอนุกรมของธุรกรรมและการแยก

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

ธุรกรรมและการโต้แย้งข้อมูล

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

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

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

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

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

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

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

การโต้แย้งข้อมูลใน SDK มือถือ/เว็บ

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

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

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

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

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

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

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

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

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

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

การแยกแบบอนุกรมได้

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

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

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

การแยกแบบอนุกรมได้ กำหนดระดับการแยกสูงสุด การแยกแบบอนุกรมได้หมายความว่า:

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

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

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

การแยกแบบอนุกรมตามเวลาที่คอมมิต

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

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

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

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

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

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

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

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