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