Tôi có một cơ sở dữ liệu SQLite được sử dụng bởi hai quy trình. Tôi tự hỏi, với phiên bản SQLite mới nhất, trong khi một quy trình (kết nối) bắt đầu giao dịch để ghi vào cơ sở dữ liệu thì quy trình kia có thể đọc đồng thời từ cơ sở dữ liệu không?
Tôi có một cơ sở dữ liệu SQLite được sử dụng bởi hai quy trình. Tôi tự hỏi, với phiên bản SQLite mới nhất, trong khi một quy trình (kết nối) bắt đầu giao dịch để ghi vào cơ sở dữ liệu thì quy trình kia có thể đọc đồng thời từ cơ sở dữ liệu không?
Câu trả lời:
Tôi đã thu thập thông tin từ nhiều nguồn khác nhau, chủ yếu là từ sqlite.org và tổng hợp chúng lại với nhau:
Đầu tiên, theo mặc định, nhiều quy trình có thể mở cùng một cơ sở dữ liệu SQLite cùng lúc và một số quyền truy cập đọc có thể được đáp ứng song song.
Trong trường hợp ghi, một lần ghi vào cơ sở dữ liệu sẽ khóa cơ sở dữ liệu trong một thời gian ngắn, không có gì, ngay cả khi đọc, có thể truy cập vào tệp cơ sở dữ liệu.
Bắt đầu từ phiên bản 3.7.0, tùy chọn “Ghi nhật ký phía trước” (WAL) mới có sẵn, trong đó việc đọc và ghi có thể tiến hành đồng thời.
Theo mặc định, WAL không được bật. Để bật WAL, hãy tham khảo tài liệu SQLite.
SQLite3 cho phép rõ ràng nhiều kết nối :
(5) Nhiều ứng dụng hoặc nhiều phiên bản của cùng một ứng dụng có thể truy cập vào một tệp cơ sở dữ liệu duy nhất cùng một lúc không?
Nhiều quy trình có thể mở cùng một cơ sở dữ liệu cùng một lúc. Nhiều quy trình có thể thực hiện một lần CHỌN cùng một lúc. Tuy nhiên, chỉ có một quy trình có thể thực hiện các thay đổi đối với cơ sở dữ liệu bất kỳ lúc nào.
Để chia sẻ kết nối, hãy sử dụng bộ đệm chia sẻ SQLite3 :
Bắt đầu với phiên bản 3.3.0, SQLite bao gồm một chế độ "shared-cache" đặc biệt ( bị tắt theo mặc định )
Trong phiên bản 3.5.0, chế độ shared-cache đã được sửa đổi để có thể chia sẻ cùng một cache trên toàn bộ quá trình thay vì chỉ trong một luồng đơn lẻ.
5.0 Bật Chế độ Bộ nhớ đệm Chia sẻ
Chế độ chia sẻ bộ nhớ cache được bật trên cơ sở mỗi quá trình. Sử dụng giao diện C, API sau có thể được sử dụng để bật hoặc tắt chế độ bộ đệm chia sẻ trên toàn cầu:
int sqlite3_enable_shared_cache (int);
Mỗi lệnh gọi sqlite3_enable_shared_cache () ảnh hưởng đến các kết nối cơ sở dữ liệu tiếp theo được tạo bằng cách sử dụng sqlite3_open (), sqlite3_open16 () hoặc sqlite3_open_v2 (). Các kết nối cơ sở dữ liệu đã tồn tại không bị ảnh hưởng. Mỗi lệnh gọi tới sqlite3_enable_shared_cache () sẽ ghi đè tất cả các lệnh gọi trước đó trong cùng một quy trình.