สามารถล็อคไฟล์ sqlite บนระบบไฟล์ NFS ได้หรือไม่

สมมติว่ามีสคริปต์หลามสองตัวที่ต้องการเขียนข้อมูลลงในตารางเดียวกันซึ่งจัดเก็บไว้ในไฟล์ SQLite โดยใช้โมดูล sqlite3 ไฟล์ SQLite ถูกเก็บไว้ในระบบไฟล์ NFS ใน SQLite-FAQ ฉันอ่านว่า:

SQLite ใช้การล็อคตัวอ่าน/ตัวเขียนเพื่อควบคุมการเข้าถึงฐานข้อมูล [...] แต่ใช้ความระมัดระวัง: กลไกการล็อคนี้อาจทำงานไม่ถูกต้องหากไฟล์ฐานข้อมูลถูกเก็บไว้ในระบบไฟล์ NFS นี่เป็นเนื่องจากการล็อกไฟล์ fcntl() ใช้งาน NFS จำนวนมากไม่ได้ คุณควรหลีกเลี่ยงการวางไฟล์ฐานข้อมูล SQLite บน NFS หากหลายกระบวนการอาจพยายามเข้าถึงไฟล์ในเวลาเดียวกัน

นี่หมายความว่าเป็นไปไม่ได้เลยหรือมีวิธีใดที่จะทำให้แน่ใจว่ากระบวนการหนึ่งรอจนกว่าอีกกระบวนการหนึ่งจะเสร็จสิ้น

INSERT นั้นไม่ซับซ้อน เพียงบางส่วน:

INSERT_STATEMENT = "INSERT INTO some_table (row, col, val) VALUES (?, ?, ?)"
connection.executemany(INSERT_STATEMENT, triples)

และเซตที่แทรกอยู่จะแยกจากกัน

คำถามเพิ่มเติม: ปัญหา NFS เกิดขึ้นเมื่อสองกระบวนการพยายามเขียนลงในตารางเดียวกันหรือเมื่อพวกเขาพยายามเขียนไปยังฐานข้อมูลเดียวกัน (ซึ่งเป็นไฟล์)? มันจะเป็นวิธีแก้ปัญหาหรือไม่ถ้าให้แต่ละกระบวนการสร้างตารางของตัวเองในฐานข้อมูล (ไฟล์) เดียวกันแล้วเขียนลงไป


person Aufwind    schedule 28.03.2012    source แหล่งที่มา


คำตอบ (1)


อย่าใช้ SQLite กับ NFS มันเป็นเรื่องง่ายเหมือนที่. ซีแมนทิกส์ NFS แตกต่างจากระบบไฟล์ปกติและหลวมกว่า คุณจะได้รับการคอรัปชั่นในที่สุด บางครั้งบางคนในรายชื่อผู้รับจดหมายของผู้ใช้ SQLite จะโพสต์พร้อม "วิธีแก้ปัญหา" ของพวกเขา พวกเขาไม่เคยได้ผลแม้ว่าจะปรากฏในระยะสั้นก็ตาม

person Roger Binns    schedule 01.04.2012
comment
น่าเสียดายที่ฉันต้องใช้ SQLite ฉันลงเอยด้วยการให้แต่ละกระบวนการมีไฟล์ของตัวเองเพื่อเขียน และรวมสคริปต์ในภายหลัง แต่ขอบคุณสำหรับคำตอบของคุณ! :-) - person Aufwind; 02.04.2012
comment
เมื่อคุณได้รับความเสียหายในที่สุด อย่าลืมระบุว่าคุณใช้ NFS และไม่ต้องแปลกใจเมื่อเสียงตอบรับจากทุกคนกลับไม่ทำอย่างนั้น - person Roger Binns; 03.04.2012
comment
อย่าทำอย่างนั้นแม้ว่าจะมีกระบวนการเดียวที่จะเข้าถึงไฟล์ได้? - person ; 14.05.2014
comment
คุณจะต้องมีโค้ดและกระบวนการที่สมบูรณ์แบบเพื่อให้แน่ใจว่าไม่มีการเข้าถึงพร้อมกันไม่ว่าในกรณีใดก็ตาม หากคุณ เคย ล้มเหลวในความสมบูรณ์แบบ คุณจะได้รับความเสียหายที่ไม่มีใครสังเกตเห็น ซึ่งในที่สุดคุณจะค้นพบสายเกินไป - person Roger Binns; 14.05.2014