2012-03-28 29 views
9

Giả sử có hai tập lệnh python muốn ghi dữ liệu vào cùng bảng được lưu trữ trong tệp SQLite bằng mô-đun sqlite3. Tệp SQLite được lưu trữ trên hệ thống tệp NFS. Trong số SQLite-FAQ Tôi đã đọc:Có thể khóa tệp sqlite trên hệ thống tệp NFS không?

SQLite sử dụng khóa đọc/ghi để kiểm soát quyền truy cập vào cơ sở dữ liệu. [...] Nhưng hãy thận trọng: cơ chế khóa này có thể không hoạt động chính xác nếu tệp cơ sở dữ liệu được lưu trữ trên hệ thống tệp NFS. Điều này là do khóa tệp fcntl() bị hỏng trên nhiều triển khai NFS. Bạn nên tránh đặt các tệp cơ sở dữ liệu SQLite trên NFS nếu nhiều quá trình có thể cố truy cập tệp cùng một lúc.

Điều này có nghĩa là không thể hoàn toàn hoặc có cách nào đó để đảm bảo rằng một quá trình chờ cho đến khi quá trình khác được thực hiện?

INSERT không phức tạp. Chỉ cần một số:

INSERT_STATEMENT = "INSERT INTO some_table (row, col, val) VALUES (?, ?, ?)" 
connection.executemany(INSERT_STATEMENT, triples) 

Và các bộ chèn được tách rời nhau.

Câu hỏi tiếp theo: NFS-Problems có xảy ra khi hai quá trình cố gắng ghi vào cùng một bảng hoặc khi chúng cố ghi vào cùng một cơ sở dữ liệu (đó là tệp) không? Nó sẽ là một workaround để cho mỗi quá trình tạo bảng riêng của mình trong cùng một cơ sở dữ liệu (tập tin) và ghi vào đó?

Trả lời

19

Không sử dụng SQLite với NFS. Nó đơn giản như vậy. Ngữ nghĩa NFS khác với các hệ thống tập tin thông thường và lỏng lẻo hơn. Bạn cuối cùng sẽ bị tham nhũng. Mỗi bây giờ và sau đó một người nào đó trong danh sách gửi thư của người dùng SQLite đăng bài với "cách giải quyết" của họ. Họ không bao giờ làm việc mặc dù họ xuất hiện trong ngắn hạn.

+7

Nghe người đàn ông này. [Anh ấy là một cơ quan.] (Http://code.google.com/p/apsw/) –

+1

Thật không may tôi phải sử dụng SQLite. Tôi đã kết thúc cho mỗi quá trình tập tin riêng của mình để ghi vào, và hợp nhất các kịch bản sau đó. Nhưng cảm ơn câu trả lời của bạn! :-) – Aufwind

+4

Khi bạn cuối cùng bị tham nhũng, hãy đảm bảo đề cập đến việc bạn đã sử dụng NFS. Và đừng ngạc nhiên khi phản ứng của mọi người là "đừng làm điều đó". –