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