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