2.1 อ่านโดยไม่มีข้อผูกมัด

"ระดับการแยกธุรกรรม" หมายถึงระดับการป้องกันที่มีให้โดยกลไกภายในของ DBMS (นั่นคือ ไม่ต้องมีการเขียนโปรแกรมพิเศษ) จากความไม่สอดคล้องของข้อมูลทั้งหมดหรือบางประเภทข้างต้นที่เกิดขึ้นระหว่างการดำเนินธุรกรรมแบบขนาน มาตรฐาน SQL-92 กำหนดระดับของการแยกสี่ระดับ:

  • อ่านไม่มีข้อผูกมัด
  • อ่านอย่างมุ่งมั่น
  • อ่านซ้ำได้
  • ทำให้เป็นอนุกรมได้

ตัวแรกคือตัวที่อ่อนแอที่สุด ตัวสุดท้ายคือตัวที่แข็งแกร่งที่สุด ตัวที่ตามมาแต่ละตัวจะรวมถึงตัวก่อนหน้าทั้งหมด

ระดับการแยกต่ำสุด (ครั้งแรก) หากธุรกรรมแบบขนานหลายรายการพยายามแก้ไขแถวของตารางเดียวกัน แถวสุดท้ายจะมีค่าที่กำหนดโดยธุรกรรมที่เสร็จสมบูรณ์ทั้งชุด ในกรณีนี้ เป็นไปได้ที่จะอ่านข้อมูลที่ไม่สอดคล้องเชิงตรรกะเท่านั้น แต่ยังรวมถึงข้อมูลที่ยังไม่ได้บันทึกการเปลี่ยนแปลงด้วย

วิธีทั่วไปในการใช้ระดับการแยกนี้คือการล็อกข้อมูลตามระยะเวลาของคำสั่ง update ซึ่งช่วยให้แน่ใจว่าคำสั่งแก้ไขในแถวเดียวกันที่รันพร้อมกันนั้นได้รับการดำเนินการตามลำดับจริง ๆ และไม่มีการเปลี่ยนแปลงใด ๆ สูญหายไป ธุรกรรมแบบอ่านอย่างเดียวจะไม่บล็อกภายใต้ระดับการแยกนี้

2.2 อ่านมุ่งมั่น

DBMS อุตสาหกรรมส่วนใหญ่ โดยเฉพาะ Microsoft SQL Server, PostgreSQL และ Oracle ใช้ระดับนี้เป็นค่าเริ่มต้น ในระดับนี้มีการป้องกันแบบร่างการอ่าน "สกปรก" อย่างไรก็ตามระหว่างการดำเนินการของธุรกรรมหนึ่งการทำธุรกรรมอื่นสามารถทำได้สำเร็จและการเปลี่ยนแปลงที่ทำขึ้นจะได้รับการแก้ไข ดังนั้น ธุรกรรมแรกจะทำงานกับชุดข้อมูลอื่น

การดำเนินการอ่านแบบสมบูรณ์อาจขึ้นอยู่กับหนึ่งในสองแนวทาง: การบล็อกหรือการกำหนดเวอร์ชัน

การบล็อกข้อมูลที่อ่านได้และไม่แน่นอน

ประกอบด้วยข้อเท็จจริงที่ว่าธุรกรรมการเขียนบล็อกข้อมูลที่ไม่แน่นอนสำหรับการอ่านธุรกรรมที่ดำเนินการในระดับการอ่านที่มุ่งมั่นหรือสูงกว่าจนกว่าจะเสร็จสิ้น จึงป้องกันการอ่านที่ "สกปรก" และข้อมูลที่ล็อกโดยธุรกรรมการอ่านจะถูกนำออกทันทีหลังจากการดำเนินการเสร็จสิ้นSELECT(ดังนั้น สถานการณ์ "ไม่สามารถอ่านซ้ำได้" อาจเกิดขึ้นได้ที่ระดับการแยกที่กำหนด)

การบันทึกแถวหลายเวอร์ชันที่เปลี่ยนแปลงพร้อมกัน

ทุกครั้งที่มีการเปลี่ยนแปลงแถว DBMS จะสร้างเวอร์ชันใหม่ของแถวนี้ ซึ่งธุรกรรมที่เปลี่ยนแปลงข้อมูลจะยังคงทำงานต่อไป ในขณะที่ธุรกรรม "การอ่าน" อื่นๆ จะส่งคืนเวอร์ชันที่คอมมิตล่าสุด ข้อดีของวิธีนี้คือเร็วกว่าเพราะป้องกันการบล็อก อย่างไรก็ตาม เมื่อเปรียบเทียบกับอันแรก ต้องใช้ RAM มากขึ้นอย่างมาก ซึ่งใช้ในการจัดเก็บเวอร์ชันของแถว

นอกจากนี้ เมื่อธุรกรรมหลายรายการเปลี่ยนข้อมูลพร้อมกัน สามารถสร้างสถานการณ์ที่ธุรกรรมพร้อมกันหลายรายการทำการเปลี่ยนแปลงที่ไม่สอดคล้องกันกับข้อมูลเดียวกันได้ (เนื่องจากไม่มีการล็อก จึงไม่มีอะไรจะป้องกันไม่ให้สิ่งนี้เกิดขึ้น) จากนั้นธุรกรรมที่คอมมิตครั้งแรกจะบันทึกการเปลี่ยนแปลงในฐานข้อมูลหลัก และธุรกรรมแบบขนานที่เหลือจะไม่สามารถคอมมิตได้ (เนื่องจากจะทำให้การอัปเดตของธุรกรรมแรกสูญหาย) สิ่งเดียวที่ DBMS สามารถทำได้ในสถานการณ์เช่นนี้คือการย้อนกลับธุรกรรมที่เหลือและแสดงข้อความแสดงข้อผิดพลาด "บันทึกมีการเปลี่ยนแปลงแล้ว"

นักพัฒนา DBMS เลือกวิธีการใช้งานเฉพาะ และในบางกรณีสามารถปรับแต่งได้ ดังนั้น ตามค่าเริ่มต้น MS SQL จะใช้การล็อก แต่ (ในเวอร์ชัน 2005 และใหม่กว่า) เมื่อตั้งค่าREAD_COMMITTED_SNAPSHOTพารามิเตอร์ฐานข้อมูล จะสลับไปใช้กลยุทธ์การกำหนดเวอร์ชัน โดยในขั้นต้น Oracle จะทำงานตามโครงร่างเวอร์ชันเท่านั้น ใน Informix คุณสามารถป้องกันความขัดแย้งระหว่างธุรกรรมการอ่านและการเขียนได้โดยการตั้งค่าตัวเลือกการกำหนดค่าUSELASTCOMMITTED(ตามเวอร์ชัน 11.1) ที่ทำให้ธุรกรรมการอ่านได้รับข้อมูลที่คอมมิตล่าสุด

2.3 อ่านซ้ำได้

ระดับที่ธุรกรรมการอ่าน "ไม่เห็น" การเปลี่ยนแปลงข้อมูลที่เคยอ่าน ในเวลาเดียวกัน ไม่มีธุรกรรมอื่นใดที่สามารถเปลี่ยนแปลงข้อมูลที่อ่านโดยธุรกรรมปัจจุบันได้จนกว่าจะสิ้นสุด

การล็อกในโหมดแชร์จะใช้กับข้อมูลทั้งหมดที่อ่านโดยคำสั่งใดๆ ในธุรกรรม และถูกระงับไว้จนกว่าธุรกรรมจะเสร็จสมบูรณ์ ซึ่งจะป้องกันไม่ให้ธุรกรรมอื่นแก้ไขแถวที่อ่านโดยธุรกรรมที่รอดำเนินการ อย่างไรก็ตาม ธุรกรรมอื่นๆ อาจแทรกบรรทัดใหม่ที่ตรงกับเงื่อนไขการค้นหาสำหรับคำแนะนำที่มีอยู่ในธุรกรรมปัจจุบัน เมื่อธุรกรรมปัจจุบันรีสตาร์ทใบแจ้งยอด แถวใหม่จะถูกดึง ส่งผลให้มีการอ่านข้อมูลปลอม

เนื่องจากการล็อคที่ใช้ร่วมกันถูกระงับไว้จนกว่าจะสิ้นสุดธุรกรรม แทนที่จะถูกปล่อยเมื่อสิ้นสุดแต่ละคำสั่ง ระดับของการทำงานพร้อมกันจึงต่ำกว่าระดับการREAD COMMITTEDแยก ดังนั้นจึงไม่แนะนำให้ใช้ธุรกรรมระดับนี้หรือสูงกว่าโดยไม่จำเป็น

2.4 ทำให้เป็นอนุกรมได้

การแยกระดับสูงสุด ธุรกรรมจะถูกแยกออกจากกันโดยสมบูรณ์ แต่ละธุรกรรมจะถูกดำเนินการราวกับว่าไม่มีธุรกรรมคู่ขนานกัน ในระดับนี้เท่านั้นที่การทำธุรกรรมพร้อมกันจะไม่อยู่ภายใต้เอฟเฟกต์ "phantom read"

2.5 รองรับการแยกธุรกรรมใน DBMS จริง

DBMS เชิงธุรกรรมไม่ได้รองรับทั้งสี่ระดับเสมอไป และอาจแนะนำระดับเพิ่มเติม นอกจากนี้ยังมีความแตกต่างหลายประการในการให้ฉนวน

ตามหลักการแล้ว Oracle ไม่รองรับระดับศูนย์เนื่องจากการใช้งานธุรกรรมไม่รวม "การอ่านที่สกปรก" และไม่อนุญาตให้ตั้งค่าระดับการอ่านซ้ำได้อย่างเป็นทางการ นั่นคือรองรับเฉพาะ ( โดยค่าเริ่มต้น) Read committedและSerializable. ในเวลาเดียวกัน ในระดับคำสั่งแต่ละรายการ รับประกันความสามารถในการอ่านซ้ำ (หากคำสั่งSELECTในธุรกรรมแรกเลือกชุดของแถวจากฐานข้อมูล และในเวลานี้ธุรกรรมที่สองขนานกันจะเปลี่ยนแถวเหล่านี้บางแถว จากนั้น ชุดผลลัพธ์ที่ได้รับจากธุรกรรมแรกจะมีแถวที่ไม่เปลี่ยนแปลง ราวกับว่าไม่มีธุรกรรมที่สอง) READ-ONLYOracle ยังสนับสนุน ธุรกรรมที่เรียกว่า ซึ่งสอดคล้องกับ Serializableแต่ไม่สามารถเปลี่ยนแปลงข้อมูลได้

และMicrosoft SQL Serverรองรับระดับการแยกธุรกรรมมาตรฐานทั้งสี่ระดับ และนอกจากนี้ ระดับ SNAPSHOT ซึ่งธุรกรรมเห็นสถานะข้อมูลที่คอมมิตก่อนที่จะเปิดตัว ตลอดจนการเปลี่ยนแปลงที่ทำขึ้นเอง กล่าวคือ ทำงานเป็น หากได้รับเมื่อเริ่มต้นสแนปชอตของข้อมูล DB และใช้งานได้ ความแตกต่างจาก Serialized คือไม่มีการใช้การล็อก แต่ผลที่ตามมาคือ การยอมรับการเปลี่ยนแปลงอาจเป็นไปไม่ได้หากการทำธุรกรรมพร้อมกันได้เปลี่ยนแปลงข้อมูลเดียวกันก่อนหน้านี้ ในกรณีนี้ ธุรกรรมที่สอง เมื่อพยายามดำเนินการCOMMITจะแสดงข้อความแสดงข้อผิดพลาดและถูกยกเลิก