ฉันมีฐานข้อมูล SQLite ที่ใช้โดยสองกระบวนการ ฉันสงสัยว่าด้วย SQLite เวอร์ชันล่าสุดในขณะที่กระบวนการหนึ่ง (การเชื่อมต่อ) เริ่มต้นธุรกรรมเพื่อเขียนไปยังฐานข้อมูลกระบวนการอื่นจะสามารถอ่านจากฐานข้อมูลพร้อมกันได้หรือไม่
ฉันมีฐานข้อมูล SQLite ที่ใช้โดยสองกระบวนการ ฉันสงสัยว่าด้วย SQLite เวอร์ชันล่าสุดในขณะที่กระบวนการหนึ่ง (การเชื่อมต่อ) เริ่มต้นธุรกรรมเพื่อเขียนไปยังฐานข้อมูลกระบวนการอื่นจะสามารถอ่านจากฐานข้อมูลพร้อมกันได้หรือไม่
คำตอบ:
ฉันรวบรวมข้อมูลจากแหล่งต่างๆซึ่งส่วนใหญ่มาจาก sqlite.org และรวบรวมข้อมูลเหล่านี้เข้าด้วยกัน:
ขั้นแรกตามค่าเริ่มต้นกระบวนการต่างๆสามารถเปิดฐานข้อมูล SQLite เดียวกันได้ในเวลาเดียวกันและสามารถเข้าถึงการอ่านหลายรายการพร้อมกันได้
ในกรณีของการเขียนการเขียนไปยังฐานข้อมูลเพียงครั้งเดียวจะล็อกฐานข้อมูลในช่วงเวลาสั้น ๆ ไม่มีอะไรแม้แต่การอ่านก็สามารถเข้าถึงไฟล์ฐานข้อมูลได้เลย
เริ่มต้นด้วยเวอร์ชัน 3.7.0 จะมีตัวเลือก“ Write Ahead Logging” (WAL)ใหม่ซึ่งการอ่านและการเขียนสามารถดำเนินการไปพร้อมกันได้
โดยค่าเริ่มต้นจะไม่เปิดใช้งาน WAL ในการเปิดใช้งาน WAL โปรดดูเอกสาร SQLite
SQLite3 อนุญาตการเชื่อมต่อหลายรายการอย่างชัดเจน:
(5) แอปพลิเคชันหลายตัวหรือหลายอินสแตนซ์ของแอปพลิเคชันเดียวกันสามารถเข้าถึงไฟล์ฐานข้อมูลเดียวพร้อมกันได้หรือไม่?
หลายกระบวนการสามารถเปิดฐานข้อมูลเดียวกันได้ในเวลาเดียวกัน หลายกระบวนการสามารถทำการเลือกได้ในเวลาเดียวกัน อย่างไรก็ตามมีเพียงกระบวนการเดียวเท่านั้นที่สามารถเปลี่ยนแปลงฐานข้อมูลได้ตลอดเวลา
สำหรับการแชร์การเชื่อมต่อให้ใช้SQLite3 shared cache :
เริ่มต้นด้วยเวอร์ชัน 3.3.0 SQLite จะมีโหมด "shared-cache" พิเศษ ( ปิดใช้งานโดยค่าเริ่มต้น )
ในเวอร์ชัน 3.5.0 โหมดแคชที่ใช้ร่วมกันได้รับการแก้ไขเพื่อให้สามารถแชร์แคชเดียวกันในกระบวนการทั้งหมดแทนที่จะเป็นเพียงเธรดเดียว
5.0 การเปิดใช้งานโหมดแคชที่ใช้ร่วมกัน
โหมดแคชที่ใช้ร่วมกันถูกเปิดใช้งานแบบต่อกระบวนการ เมื่อใช้อินเทอร์เฟซ C API ต่อไปนี้สามารถใช้เพื่อเปิดหรือปิดโหมดแคชที่ใช้ร่วมกันได้ทั่วโลก:
int sqlite3_enable_shared_cache (int);
การเรียก sqlite3_enable_shared_cache () แต่ละครั้งจะสร้างผลกระทบต่อการเชื่อมต่อฐานข้อมูลที่สร้างขึ้นโดยใช้ sqlite3_open (), sqlite3_open16 () หรือ sqlite3_open_v2 () การเชื่อมต่อฐานข้อมูลที่มีอยู่แล้วจะไม่ได้รับผลกระทบ การเรียกใช้ sqlite3_enable_shared_cache () แต่ละครั้งจะลบล้างการเรียกก่อนหน้าทั้งหมดภายในกระบวนการเดียวกัน