2012-04-26 30 views
44

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 mới nhất của SQLite, trong khi một quá trình (kết nối) bắt đầu một giao dịch để ghi vào cơ sở dữ liệu thì quy trình kia có thể đọc từ cơ sở dữ liệu cùng một lúc không?Tôi có thể đọc và ghi vào cơ sở dữ liệu SQLite đồng thời từ nhiều kết nối không?

+0

câu hỏi liên quan xem tại đây .. http: // stackoverflow.com/questions/12117016/chiến lược-cho-đồng thời-đọc-viết-và-đọc-trong-sqlite/24038860 # 24038860 – Nepster

Trả lời

76

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 chúng lại với nhau:

Thứ nhất, theo mặc định, nhiều quy trình có thể có cơ sở dữ liệu SQLite cùng mở cùng một lúc, và một số truy cập đọc có thể được thỏa mãn song song.

Trong trường hợp viết, một lần ghi vào cơ sở dữ liệu khóa cơ sở dữ liệu trong một thời gian ngắn, không có gì, thậm chí đọc, có thể truy cập vào tệp cơ sở dữ liệu.

Bắt đầu với phiên bản 3.7.0, tùy chọn “Write Ahead Logging” (WAL) mới có sẵn, trong đó đọc và viết 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.

+0

journal_mode = WAL giải quyết vấn đề của tôi! –

11

SQLite3 một cách rõ ràng cho phép multiple connections:

(5) Can nhiều ứng dụng hoặc nhiều trường hợp của cùng ứng dụng truy cập một tập tin cơ sở dữ liệu duy nhất tại cùng một lúc?

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ệnh SELECT cùng một lúc. Nhưng chỉ có một quy trình có thể thực hiện thay đổi đối với cơ sở dữ liệu bất kỳ lúc nào trong thời gian .

Đối với các kết nối chia sẻ, sử dụng SQLite3 shared cache:

Bắt đầu với phiên bản 3.3.0, SQLite bao gồm một "chia sẻ-cache" đặc biệt chế độ (tắt theo mặc định)

Trong phiên bản 3.5.0, chế độ chia sẻ bộ nhớ cache đã được sửa đổi để cùng một bộ nhớ cache có thể được chia sẻ trong toàn bộ quá trình thay vì chỉ trong một chuỗi đơn .

5.0 Bật chế độ chia sẻ bộ nhớ cache

Chế độ bộ nhớ cache chia sẻ đượ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 toàn cục chế độ chia sẻ bộ nhớ cache:

int sqlite3_enable_shared_cache (int);

Mỗi cuộc gọi sqlite3_enable_shared_cache() tác dụng cơ sở dữ liệu tiếp theo kết nối tạo ra sử dụng(), sqlite3_open16 sqlite3_open(), hoặc sqlite3_open_v2(). Kết nối cơ sở dữ liệu đã tồn tại là không bị ảnh hưởng. Mỗi cuộc gọi đến sqlite3_enable_shared_cache() ghi đè tất cả các cuộc gọi trước đó trong cùng một quá trình .

Các vấn đề liên quan