มีสถานการณ์ที่เป็นไปได้สองสามข้อซึ่งง่ายต่อการแก้ไขและสถานการณ์ที่อันตรายที่ไม่ใช่
สำหรับผู้ใช้ที่ป้อนค่าจากนั้นป้อนค่าเดียวกันในภายหลังในเวลาต่อมา SELECT แบบง่าย ๆ ก่อนที่ INSERT จะตรวจพบปัญหา สิ่งนี้ใช้ได้กับกรณีที่ผู้ใช้รายหนึ่งส่งค่าและต่อมาผู้ใช้รายอื่นส่งค่าเดียวกัน
หากผู้ใช้ส่งรายการค่าที่ซ้ำกัน - พูดว่า {ABC, DEF, ABC} - ในการเรียกใช้รหัสเดียวแอปพลิเคชันสามารถตรวจจับและกรองรายการที่ซ้ำกันซึ่งอาจทำให้เกิดข้อผิดพลาด คุณจะต้องตรวจสอบว่า DB ไม่มีค่าใด ๆ ที่ไม่ซ้ำกันก่อนการแทรก
สถานการณ์ที่ยุ่งยากคือเมื่อการเขียนของผู้ใช้คนหนึ่งอยู่ใน DBMS ในเวลาเดียวกันกับการเขียนของผู้ใช้คนอื่นและพวกเขากำลังเขียนค่าเดียวกัน จากนั้นคุณมีเงื่อนไขการแข่งขันระหว่างพวกเขา เนื่องจาก DBMS นั้นเป็นไปได้มากว่าคุณไม่ได้พูดว่าระบบใดที่คุณกำลังใช้งานอยู่ซึ่งเป็นระบบการทำงานหลายหน้าที่ที่สามารถทำงานได้ทุกช่วงเวลาในการดำเนินการ นั่นหมายความว่างานของ user1 สามารถตรวจสอบว่าไม่มีแถวที่มีอยู่แล้วงานของ user2 สามารถตรวจสอบว่าไม่มีแถวที่มีอยู่จากนั้นงานของ user1 สามารถแทรกแถวนั้นแล้วงานของ user2 สามารถแทรกแถวนั้นได้ ในแต่ละจุดงานมีความสุขเป็นรายบุคคลพวกเขากำลังทำสิ่งที่ถูกต้อง อย่างไรก็ตามข้อผิดพลาดเกิดขึ้นทั่วโลก
โดยทั่วไปแล้ว DBMS จะจัดการเรื่องนี้โดยการใส่ค่าที่เป็นปัญหา ในปัญหานี้คุณกำลังสร้างแถวใหม่ดังนั้นยังไม่มีอะไรล็อค คำตอบคือล็อคช่วง ตามที่แนะนำนี้จะล็อคช่วงของค่าไม่ว่าจะมีอยู่ในปัจจุบันหรือไม่ เมื่อล็อคช่วงที่ไม่สามารถเข้าถึงได้โดยงานอื่นจนกว่าจะปล่อยล็อค ที่จะได้รับล็อคช่วงที่คุณต้องระบุและระดับการแยกของSERIALIZABLE ปรากฏการณ์ของงานอีกด้อมในแถวหลังจากงานของคุณมีการตรวจสอบเป็นที่รู้เป็นบันทึกภาพหลอน
การตั้งค่าระดับการแยกเป็น Serializable ทั่วทั้งแอปพลิเคชันจะมีผลกระทบ ปริมาณงานจะลดลง เงื่อนไขการแข่งขันอื่น ๆ ที่ทำงานได้ดีพอในอดีตอาจเริ่มแสดงข้อผิดพลาดในขณะนี้ ฉันขอแนะนำให้ตั้งค่าบนการเชื่อมต่อซึ่งเรียกใช้งานโค้ดที่ซ้ำซ้อนของคุณและปล่อยให้ส่วนที่เหลือของแอปพลิเคชันเป็นเช่นเดิม
ทางเลือกที่ใช้รหัสคือการตรวจสอบหลังจากเขียนมากกว่าก่อน ดังนั้นทำ INSERT แล้วนับจำนวนแถวที่มีค่าแฮช หากมีการย้อนกลับการดำเนินการที่ซ้ำกัน สิ่งนี้อาจมีผลลัพธ์ที่ผิดปกติ พูดภารกิจที่ 1 เขียนจากนั้นภารกิจที่ 2 จากนั้นภารกิจที่ 1 จะตรวจสอบและค้นหาสำเนา มันย้อนกลับแม้ว่ามันจะเป็นครั้งแรก ในทำนองเดียวกันงานทั้งสองอาจตรวจพบการทำซ้ำและย้อนกลับทั้งสอง แต่อย่างน้อยคุณก็จะได้รับข้อความเพื่อใช้งานกลไกการลองใหม่และไม่มีรายการซ้ำใหม่ การย้อนกลับถูกดึงออกมาเหมือนใช้การยกเว้นเพื่อควบคุมการไหลของโปรแกรม ทราบดีว่าทุกคนงานในการทำธุรกรรมจะถูกย้อนกลับไม่ใช่เฉพาะการเขียนซ้ำ และคุณจะต้องมีธุรกรรมที่ชัดเจนซึ่งอาจลดการเกิดพร้อมกัน การตรวจสอบซ้ำจะช้าลงอย่างน่ากลัวเว้นแต่คุณจะมีดัชนีในแฮช หากคุณทำเช่นกันคุณอาจทำให้มันเป็นหนึ่งที่ไม่ซ้ำกัน!
ในขณะที่คุณได้แสดงความคิดเห็นทางออกที่แท้จริงคือดัชนีที่ไม่ซ้ำกัน ดูเหมือนว่าฉันจะชอบสิ่งนี้ควรพอดีกับหน้าต่างการบำรุงรักษาของคุณ (แน่นอนว่าคุณรู้จักระบบของคุณดีที่สุด) สมมติว่าแฮชนั้นมีแปดไบต์ สำหรับหนึ่งร้อยล้านแถวนั้นมีขนาดประมาณ 1GB ประสบการณ์แนะนำฮาร์ดแวร์ที่เหมาะสมจะทำการประมวลผลแถวจำนวนมากเหล่านี้ในหนึ่งหรือสองนาที การตรวจสอบและกำจัดซ้ำซ้อนจะเพิ่มในสิ่งนี้ แต่สามารถเขียนสคริปต์ล่วงหน้าได้ นี่เป็นเพียงส่วนหนึ่งเท่านั้น