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 đó?
Nghe người đàn ông này. [Anh ấy là một cơ quan.] (Http://code.google.com/p/apsw/) –
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
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 đó". –