คำถามติดแท็ก isolation-level

4
ALLOW_SNAPSHOT_ISOLATION และ READ_COMMITTED_SNAPSHOT
ฟอรัมและตัวอย่างแบบออนไลน์ส่วนใหญ่มักแนะนำให้มีทั้งสองอย่างALLOW_SNAPSHOT_ISOLATIONและREAD_COMMITTED_SNAPSHOTตั้งค่าเป็นเปิดเมื่อใดก็ตามที่มีคนถามสแนปชอตการกำหนดเวอร์ชันของแถวหรือคำถามที่คล้ายกัน ฉันเดาคำว่า SNAPSHOT ในการตั้งค่าทั้งสองทำให้สับสนเล็กน้อย ผมคิดว่าในการสั่งซื้อสำหรับโปรแกรมฐานข้อมูลที่จะใช้เวอร์ชันแถวแทนการล็อคสำหรับการทำงานเริ่มต้น READ_COMMITTED ฐานข้อมูลREAD_COMMITTED_SNAPSHOTเป็นชุดที่ ON โดยไม่คำนึงถึงสิ่งที่ALLOW_SNAPSHOT_ISOLATIONการตั้งค่า ALLOW_SNAPSHOT_ISOLATIONตั้งค่าจะถูกตั้งไว้ที่ ON เท่านั้นที่จะช่วยให้ภาพรวมการแยกเมื่อเริ่มต้นการทำธุรกรรม (เช่น SET แยกธุรกรรมระดับภาพรวม) โดยไม่คำนึงถึงของREAD_COMMITTED_SNAPSHOTการตั้งค่า เหตุผลเดียวที่มีการตั้งค่าทั้งสองนี้เป็น ON คือเมื่อต้องมีการอ่านการกำหนดเวอร์ชันแถวที่ยอมรับและ การแยกสแน็ปช็อต คำถามของฉันคือความเข้าใจของฉันไม่ถูกต้องในบางวิธี? และการตั้งค่าทั้งสองนี้จะต้องตั้งค่าเป็นเปิดพร้อมกันเสมอ (โดยเฉพาะอย่างยิ่งสำหรับการอ่านการกำหนดเวอร์ชันแถวที่ยอมรับได้)?

3
การจัดการภาวะพร้อมกันเมื่อใช้รูปแบบ SELECT-UPDATE
สมมติว่าคุณมีรหัสต่อไปนี้ (โปรดอย่าสนใจว่ามันแย่มาก): BEGIN TRAN; DECLARE @id int SELECT @id = id + 1 FROM TableA; UPDATE TableA SET id = @id; --TableA must have only one row, apparently! COMMIT TRAN; -- @id is returned to the client or used somewhere else ในสายตาของฉันนี่ไม่ใช่การจัดการภาวะพร้อมกันอย่างเหมาะสม เพียงเพราะคุณมีการทำธุรกรรมไม่ได้หมายความว่าคนอื่นจะไม่อ่านค่าเดียวกันกับที่คุณทำก่อนที่คุณจะได้รับการปรับปรุงของคุณ ตอนนี้ปล่อยให้รหัสตามที่เป็นอยู่ (ฉันตระหนักดีว่านี่คือการจัดการที่ดีกว่าเป็นคำสั่งเดียวหรือดียิ่งขึ้นโดยใช้คอลัมน์ autoincrement / เอกลักษณ์) สิ่งที่แน่ใจว่าวิธีที่จะทำให้มันจัดการพร้อมกันอย่างถูกต้องและป้องกันเงื่อนไขการแข่งขัน ค่า …

3
ประโยชน์ที่ได้รับจากระดับธุรกรรมการแยกรายการ SET อ่านโดยไม่ได้รับอนุญาต
ฉันใช้SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDคำสั่ง SQL ทั่วไปของฉันส่วนใหญ่เพราะนี่เป็นการฝึกฝนให้ฉันเมื่อเริ่มเรียนรู้ภาษา จากความเข้าใจของฉันระดับแยกนี้ทำหน้าที่เช่นเดียวว่าแต่ฉันเท่านั้นที่เคยมีแนวโน้มที่จะใช้งานWITH (NO LOCK)SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED มีเคยเป็นเวลาที่ผมควรจะใช้มากกว่าWITH (NO LOCK)SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ไม่ SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDผู้ใช้อื่น ๆ หยุดจากการถูกล็อคออกจากตารางที่ฉันอ่าน? ถ้า SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDใช้เพื่อหยุดล็อค แต่ฉันแค่อ่านข้อมูลจุดประสงค์ในการใช้คืออะไร? มันเป็นเพียงระบบสืบค้นที่เข้มข้นที่จะสร้างล็อค? ควรใช้หรือไม่เมื่อเรียกใช้ข้อความค้นหาที่จะกลับมาพูดอีก 5-10 วินาที? ฉันได้รับแจ้งว่าห้ามใช้ SET TRANSACTION ISOLATION LEVEL …

2
InnoDB เก็บข้อมูลธุรกรรมไว้ก่อนที่จะส่งมอบที่ไหน
ฉันได้ทำการทดสอบบางอย่างโดยใช้READ_COMMITTEDและREAD_UNCOMMITTEDที่บ้านโดยใช้เทคโนโลยี JDBC ฉันเห็นว่าREAD_UNCOMMITTEDจริง ๆ แล้วสามารถอ่านข้อมูลที่ไม่มีข้อผูกมัดเช่นข้อมูลจากธุรกรรมบางรายการที่ยังไม่ได้รับการยืนยัน คำถาม ข้อมูลที่ไม่ได้รับการจัดเก็บอยู่ที่ไหนเช่นการREAD_UNCOMMITTEDทำธุรกรรมสามารถอ่านข้อมูลที่ปราศจากข้อผูกมัดจากการทำธุรกรรมอื่นได้หรือไม่ เหตุใดจึงเป็นไปไม่ได้ที่การREAD_COMMITTEDทำธุรกรรมในการอ่านข้อมูลที่ไม่มีข้อผูกมัดนั่นคือการ "อ่านสกปรก" กลไกอะไรบังคับใช้ข้อ จำกัด นี้

4
MySQL InnoDB ล็อคกุญแจหลักในการลบแม้ใน READ COMMITTED
คำนำ แอปพลิเคชันของเราทำงานหลายเธรดที่ดำเนินการDELETEค้นหาแบบขนาน แบบสอบถามมีผลต่อข้อมูลที่แยกได้เช่นไม่ควรมีความเป็นไปได้ที่DELETEเกิดขึ้นพร้อมกันในแถวเดียวกันจากกระทู้แยก อย่างไรก็ตามตามเอกสาร MySQL ใช้ล็อคที่เรียกว่า 'คีย์ต่อไป' สำหรับDELETEงบซึ่งล็อคทั้งคีย์การจับคู่และช่องว่างบางส่วน สิ่งนี้นำไปสู่การล็อกที่ตายแล้วและทางออกเดียวที่เราพบคือใช้READ COMMITTEDระดับการแยก ปัญหา ปัญหาเกิดขึ้นเมื่อรันDELETEคำสั่งที่ซับซ้อนด้วยJOINs ของตารางขนาดใหญ่ ในบางกรณีเรามีตารางที่มีคำเตือนที่มีเพียงสองแถว แต่แบบสอบถามจำเป็นต้องวางคำเตือนทั้งหมดที่อยู่ในเอนทิตี้บางแห่งจากINNER JOINตาราง ed แยกสองตาราง แบบสอบถามมีดังนี้: DELETE pw FROM proc_warnings pw INNER JOIN day_position dp ON dp.transaction_id = pw.transaction_id INNER JOIN ivehicle_days vd ON vd.id = dp.ivehicle_day_id WHERE vd.ivehicle_id=? AND dp.dirty_data=1 เมื่อตาราง day_position มีขนาดใหญ่พอ (ในกรณีทดสอบของฉันมีแถว 1448) ธุรกรรมใด …

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

2
Shared Lock ออกเมื่อ IsolationLevel.ReadUncommitted
ฉันอ่านว่าถ้าฉันใช้ IsolationLevel.ReadUncommitted แบบสอบถามไม่ควรออกล็อคใด ๆ อย่างไรก็ตามเมื่อฉันทดสอบสิ่งนี้ฉันเห็นล็อคต่อไปนี้: Resource_Type: HOBT Request_Mode: S (แชร์แล้ว) ล็อค HOBT คืออะไร มีอะไรเกี่ยวข้องกับ HBT (ฮีปหรือล็อคแบบทรีไบนารี) ทำไมฉันยังคงได้ล็อค S ฉันจะหลีกเลี่ยงการล็อคที่ใช้ร่วมกันได้อย่างไรเมื่อทำการสอบถามโดยไม่เปิดตัวเลือกสแนปชอตระดับการแยก ฉันกำลังทดสอบสิ่งนี้ใน SQLServer 2008 และตัวเลือกสแนปชอตตั้งเป็นปิด แบบสอบถามจะทำการเลือกเท่านั้น ฉันเห็นว่าจำเป็นต้องใช้ Sch-S แม้ว่า SQL Server จะไม่แสดงในแบบสอบถามที่ล็อคอยู่ ทำไมมันถึงยังมีการล็อคที่ใช้ร่วมกันอยู่? ตาม: ระดับการแยกธุรกรรม SET (Transact-SQL) ธุรกรรมที่รันที่READ UNCOMMITTEDระดับจะไม่ออกการล็อกที่ใช้ร่วมกันเพื่อป้องกันไม่ให้ธุรกรรมอื่นแก้ไขข้อมูลที่อ่านโดยธุรกรรมปัจจุบัน ดังนั้นฉันสับสนเล็กน้อย

4
ฉันจะเพิ่มการอ่านหลังจากที่ได้ทำรายการระดับการยุติการทำรายการแล้วหรือไม่?
ภายในโพรซีเดอร์ที่เก็บฉันมีดังต่อไปนี้: (sql server 2008) SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION getStuff BEGIN TRY /* some selects, updates, etc, etc. */ .... COMMIT TRANSACTION getStuff END TRY BEGIN CATCH ... END CATCH เนื่องจากนี่คือธุรกรรมตามความคิดของฉันคือการเชื่อมต่อฐานข้อมูลส่วนที่เหลือจะไม่ได้รับผลกระทบจาก SERIALIZABLE ฉันต้องตั้งระดับการแยกโดยปริยายเพื่ออ่านความมุ่งมั่นหลังจากที่ส่งมอบหรือไม่? สิ่งนี้จะส่งผลกระทบต่อการเชื่อมต่ออื่น ๆ ระหว่างแอพพลิเคชันเซิร์ฟเวอร์และเซิร์ฟเวอร์ฐานข้อมูลของฉันหรือไม่

3
SQL Server - ระดับการแยกใดสำหรับคำสั่ง select ที่ไม่ได้บล็อก?
ฉันมีธุรกรรมที่ใช้เวลานาน (เรียกว่า, T1) ที่ดำเนินการลบปรับปรุงและแทรกบางอย่างในตารางใน SQL Server 2008 R2 ในเวลาเดียวกันกระบวนการอื่นเรียกใช้คำสั่งที่เลือกจากตารางนี้เป็นระยะ ภายใต้การตั้งค่าการแยกเริ่มต้น (READ COMMITTED ฉันคิดว่า?) T1 จะบล็อกคำสั่งที่เลือกไม่ให้ทำงานจนกว่าธุรกรรมจะทำหน้าที่หรือย้อนกลับ สิ่งที่ฉันต้องการเห็นคือคำสั่ง select เพื่อทำงานกับข้อมูลที่สอดคล้องกันแม้ในขณะที่ธุรกรรมกำลังดำเนินการอยู่ ฉันเชื่อว่าการแยก SNAPSHOT สามารถช่วยได้ แต่ไม่แน่ใจว่าฉันไปในทิศทางที่ถูกต้องหรือไม่ นี่จะเป็นระดับการแยกที่ดีที่สุดสำหรับแอปพลิเคชันนี้หรือไม่ ประการที่สองฉันไม่มีการควบคุมกระบวนการที่เรียกใช้คำสั่ง select แต่ฉันมีการควบคุมแอปพลิเคชัน. NET ที่เรียก T1 การเปลี่ยนแปลงระดับการแยกใด ๆ จะต้องการทั้งข้อความสั่งการเลือกและ T1 หรือว่าจะเพียงพอที่จะทำเครื่องหมายว่า T1 มีระดับการแยกต่างกันหรือไม่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.