Tôi có ứng dụng đa luồng sử dụng sqlite (3.7.3)Tránh cơ sở dữ liệu sqlite3 bị khóa
Tôi đang gặp lỗi khóa cơ sở dữ liệu có vẻ khá phổ biến. Tôi tự hỏi làm thế nào để tránh nó trong trường hợp của tôi.
Hãy để tôi mô tả những gì tôi đang xây dựng. Xin lỗi, không có mã nào quá lớn và phức tạp.
Tôi có khoảng 8 chủ đề đồng thời truy cập cơ sở dữ liệu. Bất kỳ một trong những chủ đề có thể đọc hoặc viết cùng một lúc.
Mỗi hàng trong một bảng trong cơ sở dữ liệu có đường dẫn tệp trỏ đến một tài nguyên + thuộc tính khác có liên quan đến tài nguyên đó.
3 trường ghi chú là người đọc, trạng thái và del.
Độc giả được tăng lên mỗi lần một sợi đọc từ tài nguyên, nhưng chỉ khi tình trạng> 0 và del = 0.
Vì vậy, tôi có một số SQL mà không
UPDATE resource set readers=readers+1 where id=? AND del=0 AND status>0
Sau đó, tôi kiểm tra số lượng hàng được cập nhật. Nó chỉ nên là 1. Sau đó tôi cố gắng đọc hàng trở lại với một lựa chọn. Tôi làm điều đó ngay cả khi nó không thành công để cập nhật vì tôi cần biết lý do không thành công.
Tôi đã thử gói cả bản cập nhật và chọn trong giao dịch nhưng điều đó không có tác dụng. Tôi đã kiểm tra rằng tôi cũng đang gọi hoàn tất các tuyên bố của mình.
Bây giờ, tôi nghĩ rằng sqlite sẽ tuần tự hóa theo mặc định. Tôi đã thử một vài chế độ mở nhưng tôi vẫn gặp lỗi tương tự.
Và trước khi bạn hỏi, tôi không có ý định truy cập mysql. Tôi hoàn toàn không cần cấu hình.
Ai đó có thể cung cấp một số gợi ý về cách tránh loại vấn đề này không? Tôi có nên di chuyển khóa của người đọc ra khỏi DB không? Nếu tôi làm điều đó, tôi nên thay thế nó bằng cơ chế nào? Tôi đang sử dụng Linux theo C++ và với thư viện tăng sẵn.
EDIT: Điều thú vị là thêm COMMIT sau khi cuộc gọi cập nhật của tôi được cải thiện đáng kể.
Cam kết thường xuyên hơn cho phép khóa chi tiết hơn trên tệp cơ sở dữ liệu, điều này sẽ làm giảm thời gian người đọc dành để chờ mở khóa bảng. Điều này xuất phát từ việc tăng chi phí tập tin nhật ký. Xem http://sqlite.org/lockingv3.html#writing để biết thêm thông tin. – checker