ฉันคิดว่าคุณกำลังพยายามแก้ไขปัญหาด้วยวิธีที่ไม่ถูกต้อง สิ่งที่คุณต้องการคือการปกป้องฐานข้อมูลอย่างสม่ำเสมอ หากบุคคลสองคนเรียกใช้กระบวนงานที่เก็บไว้ในเวลาเดียวกันความสอดคล้องของฐานข้อมูลอาจถูกละเมิด
เพื่อป้องกันความไม่สอดคล้องของฐานข้อมูลชนิดต่าง ๆ มาตรฐาน SQL มีระดับการแยกธุรกรรมสี่ระดับ:
- อ่านไม่ได้รับอนุมัติที่การทำธุรกรรมโดยทั่วไปสูญเสียมูลค่าของพวกเขาธุรกรรมอื่น ๆ ที่เห็นข้อมูลที่สกปรก อย่าใช้สิ่งนี้!
- อ่านความมุ่งมั่นที่การทำธุรกรรมเห็นเพียงข้อมูลที่ได้กระทำ แต่อาจมีความไม่สอดคล้องกันซึ่งธุรกรรมสองรายการสามารถก้าวผ่านเท้าของกันและกัน
- REPEATABLE READที่การแก้ไขแบบไม่สอดคล้องกันอ่านซ้ำไม่ได้
- SERIALIZABLEซึ่งรับประกันว่ามีบางคำสั่งเสมือนที่ดำเนินการธุรกรรมจะนำไปสู่ผลลัพธ์ที่การดำเนินการของพวกเขาเกิดขึ้น
อย่างไรก็ตามมาตรฐาน SQL มีวิธีการล็อคที่ใช้สำหรับความไม่สอดคล้องกันของฐานข้อมูลเหล่านี้และด้วยเหตุผลด้านประสิทธิภาพฐานข้อมูลจำนวนมากใช้วิธีการแยกสแน๊ปช็อตที่ใช้โดยทั่วไปมีระดับเหล่านี้:
- READ COMMITTEDซึ่งเหมือนกันในการล็อคฐานข้อมูล
- SNAPSHOT ISOLATIONที่ฐานข้อมูลเห็นภาพรวมของข้อมูลทั้งหมดและหากพยายามที่จะอัพเดทแถวที่ได้รับการปรับปรุงโดยการทำธุรกรรมอื่น ๆ ก็จะถูกยกเลิก แต่ยังมีความผิดปกติบางอย่างที่รู้จักกันดีที่สามารถเกิดขึ้นได้
- SERIALIZABLEซึ่งเหมือนกับในการล็อคฐานข้อมูล แต่คราวนี้นำไปใช้ในลักษณะที่แตกต่างไม่ใช่โดยการล็อค แต่โดยมั่นใจว่าไม่มีการละเมิดลำดับและหากตรวจพบการละเมิดดังกล่าวยกเลิกการทำธุรกรรม
การยกเลิกการทำธุรกรรมในฐานข้อมูลการแยกสแนปชอตเหล่านี้อาจฟังดูน่ากังวล แต่จากนั้นอีกครั้งทุกฐานข้อมูลเดียวจะยกเลิกการทำธุรกรรมเนื่องจากการหยุดชะงักดังนั้นแอปพลิเคชันที่สมเหตุสมผลใด ๆ
สิ่งที่คุณต้องการคือระดับการแยกSERIALIZABLE : ช่วยให้มั่นใจได้ว่าหากธุรกรรมที่ดำเนินการอย่างเป็นอิสระส่งผลให้อยู่ในสถานะที่ดีการทำธุรกรรมแบบขนานใด ๆ ก็ส่งผลให้อยู่ในสถานะที่ดี โชคดีที่ไมเคิลเคฮิลล์ได้ในวิทยานิพนธ์ปริญญาเอกของเขาพบวิธีSERIALIZABLEระดับแยกได้รับการสนับสนุนโดยฐานข้อมูลภาพรวมที่แยกได้มีความพยายามน้อย
หากใช้ระดับการแยกแบบSERIALIZABLEในฐานข้อมูลตัวแยกสแนปช็อตถ้าคนสองคนพยายามเรียกใช้โพรซีเดอร์ที่เก็บไว้พร้อมกันและพวกเขาก็จะเหยียบนิ้วเท้าของกันและกันธุรกรรมหนึ่งรายการจะถูกยกเลิก
ตอนนี้ SQL Server สนับสนุนระดับการแยกSERIALIZABLEอย่างแท้จริง(แทนที่จะเป็นสแนปชอตการแยกสแนปชอตที่อยู่เบื้องหลังคำหลักSERIALIZABLE ) หรือไม่ ค่อนข้างตรงไปตรงมาฉันไม่รู้: ฐานข้อมูลเดียวที่ฉันรู้ว่ารองรับคือ PostgreSQL
แม้ว่าฉันจะไม่ได้ให้คำแนะนำเฉพาะเกี่ยวกับ SQL Server แต่ฉันยังคงโพสต์คำตอบนี้ไว้ในฐานะผู้ใช้ PostgreSQL และผู้ใช้ฐานข้อมูลอื่นที่สามารถพิจารณาเปลี่ยนเป็น PostgreSQL ได้ประโยชน์จากคำตอบของฉัน นอกจากนี้ผู้ใช้ฐานข้อมูลที่ไม่ใช่ PostgreSQL ที่ไม่สามารถเปลี่ยนไปใช้ PostgreSQL สามารถกดดันผู้ขายฐานข้อมูลที่พวกเขาชื่นชอบเพื่อเสนอระดับการแยกSERIALIZABLEของแท้