Làm cách nào để ngăn chặn khóa cơ sở dữ liệu SQLite?


10

Từ câu hỏi thường gặp về SQLite tôi đã biết rằng:

Nhiều quy trình có thể có cùng một cơ sở dữ liệu mở cùng một lúc. Nhiều quy trình có thể được thực hiện SELECTcùng một lúc. Tuy nhiên, chỉ có một quá trình có thể thực hiện thay đổi cơ sở dữ liệu bất cứ lúc nào.

Vì vậy, như xa như tôi hiểu rằng tôi có thể: 1) đọc db từ nhiều chủ đề ( SELECT) 2) đọc db từ nhiều chủ đề ( SELECT) và write từ sợi đơn ( CREATE, INSERT, DELETE)

Nhưng, tôi đã đọc về Ghi nhật ký Viết trước cung cấp nhiều đồng thời hơn vì người đọc không chặn nhà văn và nhà văn không chặn người đọc . Đọc và viết có thể tiến hành đồng thời.

Cuối cùng, tôi đã hoàn toàn nhầm lẫn khi tôi tìm thấy , khi được chỉ định:

Dưới đây là các lý do khác để nhận lỗi SQLITE_LOCKED:

  • Đang cố gắng CREATEhoặc DROPmột bảng hoặc chỉ mục trong khi một SELECTcâu lệnh vẫn đang chờ xử lý.
  • Cố gắng ghi vào bảng trong khi a SELECTđang hoạt động trên cùng bảng đó.
  • Cố gắng thực hiện hai cái SELECTtrên cùng một bảng trong cùng một ứng dụng đa luồng, nếu sqlite không được đặt để làm như vậy.
  • fcntl (3, cuộc gọi F_SETLK trên tệp DB không thành công. Ví dụ, điều này có thể do sự cố khóa NFS. Một giải pháp cho vấn đề này là mv DB đi và sao chép lại để nó có giá trị Inode mới

Vì vậy, tôi muốn làm rõ cho mình, có cần tránh khóa không? Tôi có thể đọc và viết cùng một lúc từ hai chủ đề khác nhau không? Cảm ơn.

Câu trả lời:


8

Trang mà bạn đã liên kết, ngoài việc khá cũ, nói về các truy cập từ cùng một quy trình thông qua cùng một kết nối cơ sở dữ liệu (hoặc thông qua nhiều kết nối trong chế độ bộ đệm chung mà bạn không nên sử dụng).

Khi không ở chế độ WAL, nhiều kết nối có thể đọc từ cùng một cơ sở dữ liệu, nhưng giao dịch bằng văn bản là độc quyền, nghĩa là không có độc giả hoặc nhà văn nào khác được phép.

Trong chế độ WAL, một nhà văn và độc giả không chặn nhau, nhưng vẫn chỉ có một nhà văn được phép.


1
Có gì sai với chế độ bộ nhớ cache được chia sẻ? Tôi đã có thể nhận được nhiều luồng python trong cùng một quy trình để ghi vào một bảng với nó thông qua một vòng lặp Parallel for joblb . Tôi đã có vấn đề khóa cho đến khi một bộ isolation_level=Nonemặc dù. Không có chế độ bộ đệm chia sẻ, làm thế nào để tôi chia sẻ phiên bản giữa các luồng?
Justin thân mến

1
Các tài liệu mô tả những nhược điểm. Điều này đặc biệt nguy hiểm nếu bạn không biết cách tránh bế tắc.
CL.

Đến vào bữa tiệc rất muộn, nhưng liên kết này rất hữu ích. manski.net/2012/10/sqlite-performance
infocyde
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.