หน้านี้จะอธิบายถึงการแย่งชิงข้อมูลธุรกรรม ความสามารถในการทำให้เป็นอนุกรม และ การแยก ดูตัวอย่างโค้ดธุรกรรมได้ที่ ธุรกรรมและการเขียนแบบกลุ่มแทน
การแย่งกันใช้ธุรกรรมและข้อมูล
หากต้องการให้ธุรกรรมสำเร็จ เอกสารที่ดึงข้อมูลโดยการดำเนินการอ่าน ต้องไม่มีการแก้ไขโดยการดำเนินการภายนอกธุรกรรม หากการดำเนินการอื่นพยายามเปลี่ยนเอกสารใดเอกสารหนึ่ง การดำเนินการนั้นจะเข้าสู่สถานะการแย่งชิงข้อมูลกับธุรกรรม
- การแย่งใช้ข้อมูล
- เมื่อการดำเนินการ 2 รายการขึ้นไปแข่งขันกันเพื่อควบคุมเอกสารเดียวกัน เช่น ธุรกรรมหนึ่งอาจกำหนดให้เอกสารต้องสอดคล้องกันในขณะที่การดำเนินการพร้อมกัน พยายามอัปเดตค่าฟิลด์ของเอกสารนั้น
Cloud Firestore แก้ไขการแย่งชิงข้อมูลโดยการหน่วงเวลาหรือทำให้การดำเนินการอย่างใดอย่างหนึ่งล้มเหลว Cloud Firestore ไลบรารีของไคลเอ็นต์ จะลองทำธุรกรรมที่ล้มเหลวเนื่องจากมีการแย่งกันเข้าถึงข้อมูลอีกครั้งโดยอัตโนมัติ หลังจากพยายามดำเนินการอีกครั้ง จำนวนครั้งที่แน่นอน การดำเนินการธุรกรรมจะล้มเหลวและแสดงข้อความ ข้อผิดพลาด
ABORTED: Too much contention on these documents. Please try again.
เมื่อตัดสินใจว่าจะให้การดำเนินการใดล้มเหลวหรือล่าช้า ลักษณะการทำงานจะขึ้นอยู่กับประเภท การควบคุมการทำงานพร้อมกัน
การควบคุมการเกิดขึ้นพร้อมกัน
โหมดพร้อมกันเป็นตัวเลือกฐานข้อมูลที่กำหนดค่าได้ Cloud Firestore รองรับโหมดการทำงานพร้อมกันต่อไปนี้
PESSIMISTIC: การควบคุมการทำงานพร้อมกันแบบมองในแง่ร้ายจะถือว่าการแย่งชิงข้อมูลมีแนวโน้มที่จะเกิดขึ้น ธุรกรรมแบบมองในแง่ร้าย ใช้การล็อกฐานข้อมูลเพื่อป้องกันไม่ให้การดำเนินการอื่นๆ แก้ไขข้อมูลการควบคุมการทำงานพร้อมกันแบบมองในแง่ร้ายจะทำให้ธุรกรรมล็อกเอกสารที่อ่าน การล็อกธุรกรรมในเอกสารจะบล็อกธุรกรรมอื่นๆ การเขียนแบบกลุ่ม และการเขียนที่ไม่ใช่ธุรกรรมไม่ให้เปลี่ยนแปลงเอกสารนั้น ธุรกรรมจะปลดล็อกเอกสารเมื่อถึงเวลาคอมมิต นอกจากนี้ ยังยกเลิกการล็อกหากหมดเวลาหรือล้มเหลวด้วยเหตุผลใดก็ตาม
เมื่อธุรกรรมล็อกเอกสาร การดำเนินการเขียนอื่นๆ จะต้องรอให้ธุรกรรมปล่อยการล็อก ธุรกรรมจะรับล็อกตามลำดับเวลา
OPTIMISTIC: การควบคุมการทำงานพร้อมกันแบบมองโลกในแง่ดีถือว่าการแย่งชิงข้อมูลไม่น่าจะเกิดขึ้น หรือการล็อกฐานข้อมูลไม่ใช่วิธีที่มีประสิทธิภาพ ธุรกรรมแบบมองโลกในแง่ดีจะไม่ใช้การล็อกฐานข้อมูลเพื่อบล็อกการดำเนินการอื่นๆ ไม่ให้เปลี่ยนแปลงข้อมูลการควบคุมการทำงานพร้อมกันแบบมองโลกในแง่ดีช่วยให้ธุรกรรมติดตามเอกสารทั้งหมดที่คุณอ่านภายในธุรกรรมได้ ธุรกรรมจะดำเนินการเขียนให้เสร็จสมบูรณ์ก็ต่อเมื่อไม่มีการเปลี่ยนแปลงเอกสารใดๆ ในระหว่างการดำเนินการของธุรกรรม หากมีการเปลี่ยนแปลงเอกสารใดๆ ตัวแฮนเดิลธุรกรรมจะลองทำธุรกรรมอีกครั้ง หากธุรกรรมไม่สามารถรับผลลัพธ์ที่สะอาดหลังจากลองอีก 2-3 ครั้ง ธุรกรรมจะล้มเหลวเนื่องจากมีการแย่งชิงข้อมูล
ค่าเริ่มต้นของโหมดการทำงานพร้อมกัน
ค่าเริ่มต้นสำหรับรุ่น Standard คือ PESSIMISTIC ค่าเริ่มต้นสำหรับรุ่น Enterprise คือ OPTIMISTIC อย่างไรก็ตาม ลักษณะการทำงานยังขึ้นอยู่กับ
ประเภทของไลบรารีของไคลเอ็นต์ด้วย ดังนี้
SDK สำหรับอุปกรณ์เคลื่อนที่/เว็บใช้การควบคุมการทำงานพร้อมกันแบบมองโลกในแง่ดี SDK สำหรับอุปกรณ์เคลื่อนที่และเว็บจะทำงานโดยไม่ขึ้นกับการตั้งค่านี้ เนื่องจากจะจำลองการทำงานแบบการทำงานพร้อมกันแบบมองโลกในแง่ดีเสมอ
ไลบรารีของไคลเอ็นต์เซิร์ฟเวอร์ใช้การควบคุมการทำงานพร้อมกันของการตั้งค่าฐานข้อมูล
การแย่งชิงข้อมูลใน SDK บนอุปกรณ์เคลื่อนที่/เว็บ
SDK บนอุปกรณ์เคลื่อนที่และเว็บจะจำลองธุรกรรมการทำงานพร้อมกันแบบมองโลกในแง่ดีโดยใช้เงื่อนไขเบื้องต้นในการเขียน
ในเวอร์ชันของเอกสาร การจำลองนี้จะเกิดขึ้นโดยไม่คำนึงถึงการตั้งค่าโหมดพร้อมกันของฐานข้อมูล SDK บนอุปกรณ์เคลื่อนที่และเว็บไม่ได้ใช้ฟีเจอร์ธุรกรรมในตัว
ดังนั้นแม้ว่าจะกำหนดค่าโหมดการทำงานพร้อมกันของฐานข้อมูลสำหรับ PESSIMISTIC ไคลเอ็นต์บนอุปกรณ์เคลื่อนที่ก็จะยังคงทำงานแบบมองโลกในแง่ดี
SDK บนอุปกรณ์เคลื่อนที่/เว็บใช้การควบคุมการทำงานพร้อมกันแบบมองโลกในแง่ดี เนื่องจากสามารถทำงานใน สภาพแวดล้อมที่มีเวลาในการตอบสนองสูงและการเชื่อมต่อเครือข่ายที่ไม่เสถียร การล็อก เอกสารในสภาพแวดล้อมที่มีเวลาในการตอบสนองสูงจะทําให้เกิดความล้มเหลวในการแย่งชิงข้อมูล มากเกินไป
การแย่งชิงข้อมูลในไลบรารีของไคลเอ็นต์เซิร์ฟเวอร์
ไลบรารีของไคลเอ็นต์เซิร์ฟเวอร์ (C#, Go, Java, Node.js, PHP, Python, Ruby) ใช้ฟีเจอร์ธุรกรรมในตัว ธุรกรรมเหล่านี้ใช้การตั้งค่าโหมดพร้อมกันระดับฐานข้อมูล และค่าเริ่มต้นจะขึ้นอยู่กับรุ่น ดังนี้
รุ่น Enterprise ใช้การควบคุมการทำงานพร้อมกันแบบมองโลกในแง่ดีโดยค่าเริ่มต้นเพื่อ รองรับการดำเนินการที่สแกนทั้งคอลเล็กชัน การควบคุมการทำงานพร้อมกันแบบมองโลกในแง่ดีช่วยหลีกเลี่ยงการดำเนินการสแกนที่ล็อกเอกสารจำนวนมาก
รุ่นมาตรฐานใช้การควบคุมการทำงานพร้อมกันแบบมองในแง่ร้าย และ ถือว่ามีความหน่วงต่ำและมีการเชื่อมต่อที่เชื่อถือได้กับฐานข้อมูล
การแยกที่ทำให้เป็นอนุกรมได้
การแย่งชิงข้อมูลระหว่างธุรกรรมมีความเกี่ยวข้องอย่างใกล้ชิดกับระดับการแยกฐานข้อมูล ระดับการแยกของฐานข้อมูลอธิบายว่าระบบ จัดการความขัดแย้งระหว่างการดำเนินการพร้อมกันได้ดีเพียงใด ความขัดแย้งเกิดจากข้อกำหนดของฐานข้อมูลต่อไปนี้
- ธุรกรรมต้องใช้ข้อมูลที่ถูกต้องและสอดคล้องกัน
- ฐานข้อมูลจะดำเนินการพร้อมกันเพื่อใช้ทรัพยากรอย่างมีประสิทธิภาพ
ในระบบที่มีระดับการแยกต่ำ การดำเนินการอ่านภายในธุรกรรม อาจอ่านข้อมูลที่ไม่ถูกต้องจากการเปลี่ยนแปลงที่ยังไม่ได้คอมมิตในการดำเนินการพร้อมกัน
การแยกที่ทำให้เป็นอนุกรมได้กำหนดระดับการแยกสูงสุด การแยก ที่ทำให้สามารถเรียงลำดับได้หมายความว่า
- คุณสามารถถือว่าฐานข้อมูลดำเนินการธุรกรรมเป็นชุด
- ธุรกรรมจะไม่ได้รับผลกระทบจากการเปลี่ยนแปลงที่ยังไม่ได้คอมมิตในการดำเนินการพร้อมกัน
การรับประกันนี้ต้องมีผลแม้ว่าฐานข้อมูลจะดำเนินการธุรกรรมหลายรายการ พร้อมกันก็ตาม ฐานข้อมูลต้องใช้การควบคุมการทำงานพร้อมกันเพื่อ แก้ไขข้อขัดแย้งที่จะทำให้การรับประกันนี้ใช้งานไม่ได้
Cloud Firestore รับประกันการแยกธุรกรรมที่สามารถทำให้เป็นอนุกรมได้ ธุรกรรมใน Cloud Firestore จะได้รับการจัดลำดับและแยกตามเวลา ที่คอมมิต
การแยกที่ทำให้เป็นอนุกรมได้ตามเวลาคอมมิต
Cloud Firestore จะกำหนดเวลาคอมมิตให้กับแต่ละธุรกรรม ซึ่งแสดง จุดเดียวในเวลา เมื่อ Cloud Firestore ยืนยันการเปลี่ยนแปลงของธุรกรรม ในฐานข้อมูล คุณจะถือว่าการอ่านและการเขียนทั้งหมดภายใน ธุรกรรมเกิดขึ้นตรงเวลาที่ยืนยัน
การดำเนินการธุรกรรมจริงต้องใช้เวลาช่วงหนึ่ง การดำเนินการ ธุรกรรมจะเริ่มก่อนเวลาคอมมิต และการดำเนินการหลายรายการ อาจทับซ้อนกัน Cloud Firestore ยึดถือการแยกธุรกรรมที่ทำให้เป็นอนุกรมได้ และรับประกันว่า
- Cloud Firestore จะคอมมิตธุรกรรมตามลำดับเวลาคอมมิต
- Cloud Firestore แยกธุรกรรมจากการดำเนินการพร้อมกัน ที่มีเวลาคอมมิตในภายหลัง
ในกรณีที่มีการแย่งชิงข้อมูลระหว่างการดำเนินการพร้อมกัน Cloud Firestoreใช้การควบคุมการทำงานพร้อมกันแบบมองโลกในแง่ดีและมองโลกในแง่ร้ายเพื่อแก้ไขการแย่งชิง
การแยกภายในธุรกรรม
การแยกธุรกรรมยังใช้กับการดำเนินการเขียนภายในธุรกรรมด้วย การค้นหาและการอ่านภายในธุรกรรมจะไม่เห็นผลลัพธ์ของการเขียนก่อนหน้า ภายในธุรกรรมนั้น แม้ว่าคุณจะแก้ไขหรือลบเอกสารภายในธุรกรรม การอ่านเอกสารทั้งหมดในธุรกรรมนั้นจะแสดงเวอร์ชันของเอกสาร ณ เวลาที่คอมมิต ก่อนการดำเนินการเขียนของธุรกรรม การดำเนินการอ่านจะไม่แสดงผลใดๆ หากไม่มีเอกสารในขณะนั้น
ปัญหาเกี่ยวกับการแย่งชิงข้อมูล
ดูข้อมูลเพิ่มเติมเกี่ยวกับการแย่งชิงข้อมูลและวิธีแก้ไขได้ที่หน้าการแก้ปัญหา