SQLite ที่มีสองกระบวนการของไพ ธ อนเข้าถึง: หนึ่งการอ่านหนึ่งการเขียน


22

ฉันกำลังพัฒนาระบบขนาดเล็กที่มีสององค์ประกอบ: โพลหนึ่งข้อมูลจากแหล่งข้อมูลอินเทอร์เน็ตและแปลเป็นข้อมูล sql เพื่อคงอยู่ในระบบ คนที่สองอ่านว่าข้อมูล sql จากอินสแตนซ์ในท้องถิ่นและให้บริการผ่านทาง json และ api ที่สงบ

เดิมทีฉันวางแผนจะคงข้อมูลไว้กับ postgresql แต่เนื่องจากแอปพลิเคชันจะมีข้อมูลปริมาณน้อยมากในการจัดเก็บและรับส่งข้อมูลเพื่อให้บริการฉันคิดว่ามันเกินความจริง SQLite ขึ้นอยู่กับงานหรือไม่? ฉันชอบความคิดของรอยเท้าขนาดเล็กและไม่จำเป็นต้องบำรุงรักษาเซิร์ฟเวอร์ SQL อื่นสำหรับงานนี้ แต่ฉันกังวลเกี่ยวกับการทำงานพร้อมกัน

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

อินสแตนซ์ SQLite เดียวสามารถรักษากระบวนการที่เกิดขึ้นพร้อมกันสองกระบวนการให้เข้าถึงได้หากมีเพียงหนึ่งการอ่านและการเขียนอื่นเท่านั้น ฉันเริ่มเขียนโค้ด แต่สงสัยว่านี่เป็นการใช้ผิดของ SQLite หรือไม่


3
@gnat ยอดเยี่ยม อินสแตนซ์ SQLite เดียวสามารถรักษากระบวนการที่เกิดขึ้นพร้อมกันสองกระบวนการให้เข้าถึงได้หากมีเพียงหนึ่งการอ่านและการเขียนอื่นเท่านั้น ฉันเริ่มเขียนโค้ด แต่สงสัยว่านี่เป็นการใช้ผิดของ SQLite หรือไม่
bb

แค่หัวขึ้น ใน บริษัท ก่อนหน้าของฉันเราใช้ SQL (ทั้ง MS และ Oracle Express) สำหรับการจัดเก็บบางส่วนและเรามักจะรู้สึกว่าสิ่งที่เราเก็บเล็ก ๆ น้อย ๆ เราไม่ต้องการ DB เต็มรูปแบบ ดังนั้นหนึ่งในรุ่นที่เราตัดสินใจทำในสิ่งที่คุณกำลังทำ แทนที่ผลิตภัณฑ์เหล่านั้นด้วย SQLite เรามีสิ่งเดียวกันนักเขียนคนหนึ่งที่จะวางข้อมูลบนดิสก์และอัปเดต TOC ที่ใช้ SQL และกระบวนการอ่าน (หลายเธรด) ที่จะอ่าน TOC เพื่อกำหนดว่าจะดึงข้อมูลใด ไม่ทราบเกี่ยวกับ SQLite วันนี้ แต่สิ่งเล็ก ๆ น้อย ๆ ที่เราเห็นพ้องต้องกันว่าเป็นความเจ็บปวดครั้งใหญ่ใน ...
DXM

... ด้านหลัง ฉันจำรายละเอียดทั้งหมดไม่ได้ แต่ฉันคิดว่าเมื่อกระบวนการหนึ่งพยายามล็อคและทำไม่ได้เพราะอีกอันกำลังอ่านอยู่มันจะนอนสำหรับบางสิ่งที่คลั่งไคล้เช่น 20-30 วินาที เราลงเอยด้วยการสร้างเธรดเฉพาะที่รับผิดชอบการเข้าถึง SQLite และจากนั้นเรามีทั้งกระบวนการของเราและเธรดทั้งหมดในนั้นทำการเรียงลำดับคำร้องขอ DB ของพวกเขาให้เป็นหนึ่งเธรดนั้น ในการเข้าใจย้อนหลังฉันอาจจะไม่ได้ไปกับ SQLite อีกครั้ง
DXM

1
@DXM ขอบคุณสำหรับคำเตือน แต่หลังจากทำการทดสอบสองสามครั้งฉันไม่ได้วิ่งไปเทียบกับสิ่งที่คล้ายกัน ฉันรู้ว่า sqlite มีการยกเครื่องครั้งใหญ่ในเวอร์ชัน 3 ซึ่งประมาณปี 2004 ดังนั้นฉันสงสัยว่าประสบการณ์เชิงลบของคุณจะย้อนกลับไปก่อนหน้านั้นหรือไม่
bb

1
... ตัวคุณเองแทนที่จะพึ่งพาชุดล็อคของ SQLite ฉันไม่ได้ทำงานด้วยตัวเองมันเป็นอีกทีมหนึ่ง แต่ฉันเก็บไว้ในวงส่วนใหญ่เพื่อแสดงความคิดเห็น ฉันไปออนไลน์และได้อ่านหนังสืออย่างอิสระและพบหน้าผู้แต่งดั้งเดิม จากการอ่านที่ฉันได้รับความประทับใจที่นักประดิษฐ์ของ SQLite เพียงแค่เกลียดกระทู้และไม่เห็นว่าทำไมใครจะใช้พวกเขาดังนั้นก) DB ไม่ได้ออกแบบมาในใจพวกเขาและ b) ล็อค / ป้องกันถูกเพิ่ม / แฮ็คในภายหลังเพราะมีคนถามหามันมากเกินไป
DXM

คำตอบ:


25

คุณกำลังมองหาไฟล์ล็อคและเห็นพ้องด้วยเอกสาร

กระบวนการ SQLite ใช้ชุดล็อคเพื่อจัดการภาวะพร้อมกัน เพื่ออ่านกระบวนการหลายอย่างสามารถขอรับการSHAREDล็อกได้

กระบวนการที่เขียนจะต้องได้รับการRESERVEDล็อคและเมื่อมีการล้างข้อมูลการเปลี่ยนแปลงในดิสก์จะย้ายไปสู่PENDINGสถานะ กระบวนการอ่านใด ๆ จะต้องปลดล็อกไฟล์หลังจากนั้นขั้นตอนการเขียนสามารถย้ายไปที่EXCLUSIVEการเขียนไปยังไฟล์ฐานข้อมูลจริง

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

SQLite ไม่เหมาะสมเมื่อคุณมีกระบวนการหลายกระบวนการที่มักจะเขียนไปยังฐานข้อมูลเดียวกันบ่อยครั้งเนื่องจากการเขียนนั้นต้องได้รับการPENDINGล็อคแบบเอกสิทธิ์


ขอบคุณสำหรับคำตอบอย่างละเอียด Martijn! ฉันสคริปต์บางอย่างเพื่อทำการทดสอบและดูเหมือนว่าสองกระบวนการจะอ่านและเขียนตัวอย่าง sqlite อย่างมีความสุขพร้อมกัน ฉันกำลังทำคำขออ่านและเขียนพร้อมกันซึ่งจะส่งออกทุกๆ 1/100 ของวินาทีและยังไม่ได้รับข้อยกเว้น db ที่ถูกล็อค แปลกเพียงครั้งเดียวที่ฉันได้รับข้อความข้อผิดพลาด "ล็อคฐานข้อมูล" คือเมื่อพยายามด้วยตนเอง (ด้วยไคลเอนต์บรรทัดคำสั่ง sqlite3) เพื่อลบไม่กี่แถวในขณะที่การร้องขอการอ่านถูกยิงออกจากสคริปต์ของฉันที่ 1/100 วินาที ฉันสงสัยว่า pysql ลองเขียนอีกครั้งโดยอัตโนมัติหลังจากเกิดข้อผิดพลาด
bb

10

แค่ต้องการติดตามและแจ้งให้ทุกคนทราบว่าการดำเนินการนั้นประสบความสำเร็จ การทำงานกับ SQLite นั้นเป็นเรื่องที่น่ายินดีและมีเพียงหนึ่งกระบวนการเท่านั้นที่เขียนในเวลาที่เราไม่เคยมีปัญหาเกี่ยวกับการล็อก ... แม้จะมีการอ่านพร้อมกันอย่างรวดเร็วจากกระบวนการรอง

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