Tôi có thể đọc và ghi đồng thời vào cơ sở dữ liệu SQLite từ nhiều kết nối không?


87

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 hỏi liên quan xem tại đây .. stackoverflow.com/questions/12117016/…
AndroidGeek

Câu trả lời:


142

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.


Vì vậy, theo giả thuyết nếu bạn phải giải quyết một vấn đề mà bạn muốn dữ liệu cục bộ mà không làm cho công chúng có thể truy cập được nhưng khả năng ghi nhiều tệp song song, bạn sẽ cần một tệp cơ sở dữ liệu cho mỗi lần ghi để nhiều lần ghi có thể xảy ra đồng thời. Là nó? Tôi biết nhiều file thường được tán thành nhưng tôi đang cố gắng để tìm ra một cách để làm nhiều lần ghi từ một nhiệm vụ cần tây mà không sử dụng một cơ sở dữ liệu phía máy chủ như tôi cần những dữ liệu chỉ cho phép tính địa phương
PirateApp

Có một pragma, lock_mode = unique có thể được sử dụng để khóa cơ sở dữ liệu trong một quá trình duy nhất, nếu bạn muốn ngăn chức năng này.
Scovetta

20

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.