ฉันจะป้องกันการล็อคฐานข้อมูล SQLite ได้อย่างไร


11

จากคำถามที่พบบ่อย SQLite ฉันรู้ว่า:

กระบวนการหลายอย่างสามารถเปิดฐานข้อมูลเดียวกันได้ในเวลาเดียวกัน กระบวนการหลายอย่างสามารถทำได้SELECTในเวลาเดียวกัน อย่างไรก็ตามมีเพียงกระบวนการเดียวเท่านั้นที่สามารถเปลี่ยนแปลงฐานข้อมูลได้ทุกเวลา

ดังนั้นเท่าที่ผมเข้าใจว่าฉันสามารถ: 1) อ่านฐานข้อมูลจากหลายหัวข้อ ( SELECT) 2) อ่านฐานข้อมูลจากหลายหัวข้อ ( SELECT) และเขียนจากหัวข้อเดียว ( CREATE, INSERT, DELETE)

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

ในที่สุดฉันก็สับสนงงเมื่อฉันพบมันเมื่อมีการระบุ:

นี่คือเหตุผลอื่น ๆ สำหรับการรับข้อผิดพลาด SQLITE_LOCKED:

  • พยายามที่จะCREATEหรือDROPตารางหรือดัชนีในขณะที่SELECTคำสั่งยังคงค้างอยู่
  • กำลังพยายามเขียนลงในตารางในขณะที่ a SELECTกำลังทำงานบนตารางเดียวกัน
  • พยายามทำสองอย่างSELECTในตารางเดียวกันในเวลาเดียวกันในแอปพลิเคชันแบบมัลติเธรดถ้า sqlite ไม่ได้ถูกตั้งค่าให้ทำเช่นนั้น
  • fcntl (3, F_SETLK การเรียกใช้ไฟล์ DB ล้มเหลวซึ่งอาจเกิดจากปัญหาการล็อค NFS ตัวอย่างหนึ่งวิธีแก้ปัญหาสำหรับปัญหานี้คือการลบ mv ออกและคัดลอกกลับเพื่อให้มีค่า Inode ใหม่

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

คำตอบ:


9

เพจที่คุณเชื่อมโยงนั้นนอกจากจะค่อนข้างเก่าแล้วยังพูดถึงการเข้าถึงจากกระบวนการเดียวกันผ่านการเชื่อมต่อฐานข้อมูลเดียวกัน (หรือผ่านการเชื่อมต่อหลายครั้งในโหมดแคชที่ใช้ร่วมกันซึ่งคุณไม่ควรใช้)

เมื่อไม่ได้อยู่ในโหมด WAL การเชื่อมต่อหลายรายการสามารถอ่านได้จากฐานข้อมูลเดียวกัน แต่การทำธุรกรรมการเขียนเป็นเอกสิทธิ์เช่นไม่อนุญาตให้ผู้อ่านหรือนักเขียนคนอื่น

ในโหมด WAL นักเขียนและผู้อ่านจะไม่บล็อกซึ่งกันและกัน แต่ยังมีเพียงหนึ่งตัวเขียนที่ได้รับอนุญาต


1
เกิดอะไรขึ้นกับโหมดแคชที่แชร์ ผมสามารถที่จะได้รับหัวข้อหลามหลายในกระบวนการเดียวกันที่จะเขียนถึงตารางที่มีผ่านทางขนาน joblb สำหรับวง ฉันได้ล็อคปัญหาจนกว่าชุดisolation_level=Noneแม้ว่า หากไม่มีโหมดแคชที่แชร์ฉันจะแชร์อินสแตนซ์ระหว่างเธรดได้อย่างไร
Justin Dearing

1
เอกสารอธิบายข้อเสีย มันอันตรายอย่างยิ่งหากคุณไม่รู้วิธีหลีกเลี่ยงการหยุดชะงัก
CL

มางานปาร์ตี้ช้ามาก แต่ลิงค์นี้มีประโยชน์ manski.net/2012/10/sqlite-performance
infocyde
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.