2013-08-13 34 views
7

Tôi đang sử dụng mô-đun python sqlite3 để ghi kết quả từ các tác vụ hàng loạt vào một tệp phổ biến .db. Tôi đã chọn SQLite bởi vì nhiều tiến trình có thể cố gắng viết cùng một lúc, và khi tôi hiểu nó, SQLite nên xử lý tốt điều này. Những gì tôi không chắc chắn là những gì sẽ xảy ra khi nhiều quá trình kết thúc và cố gắng viết cùng một lúc. Vì vậy, nếu một số quá trình trông giống như thế nàyViết đồng thời với sqlite3

conn = connect('test.db') 

with conn: 
    for v in xrange(10): 
     tup = (str(v), v) 
     conn.execute("insert into sometable values (?,?)", tup) 

thực hiện cùng một lúc, họ sẽ ném một ngoại lệ? Chờ đợi lịch sự cho các quá trình khác để viết? Có cách nào tốt hơn để làm điều này?

+1

không chắc chắn nếu đây là một dup: Tôi hỏi về hành vi của một mô-đun python cụ thể, không phải SQLite nói chung. – Shep

Trả lời

16

Thư viện sqlite sẽ khóa cơ sở dữ liệu mỗi quá trình khi văn bản cho cơ sở dữ liệu và mỗi quá trình sẽ chờ cho khóa sẽ được phát hành để có được lần lượt của họ.

Cơ sở dữ liệu không cần phải được ghi đến thời điểm cam kết. Bạn đang sử dụng kết nối như một trình quản lý ngữ cảnh (tốt!) Để cam kết diễn ra sau khi vòng lặp của bạn đã hoàn thành và tất cả các câu lệnh insert đã được thực hiện.

Nếu cơ sở dữ liệu của bạn có ràng buộc duy nhất tại chỗ, có thể là cam kết không thành công vì một quá trình đã thêm hàng mà một quá trình khác xung đột với.

+1

vì vậy khóa có được bật tại 'connect' hoặc khi cam kết xảy ra không? – Shep

+1

Khóa được chụp khi viết. –

+1

@MartijnPieters ... và khóa được giải phóng khi trở về từ cuộc gọi hàm cam kết. Hoặc là tôi sai? –

4

Nếu mỗi quá trình giữ kết nối của riêng nó thì sẽ ổn thôi. Điều sẽ xảy ra là khi viết quy trình sẽ khóa DB, để tất cả các quy trình khác sẽ chặn. Họ sẽ ném một ngoại lệ nếu hết thời gian chờ để đợi cho số miễn phí DB bị vượt quá. Thời gian chờ có thể được cấu hình thông qua các cuộc gọi kết nối:

http://docs.python.org/2/library/sqlite3.html#sqlite3.connect

Nó không được khuyến cáo rằng bạn có tập tin DB của bạn trong một mạng chia sẻ.

Cập nhật:

Bạn cũng có thể muốn kiểm tra mức độ cách ly: http://docs.python.org/2/library/sqlite3.html#sqlite3.Connection.isolation_level

0

Các tin tốt là thư viện SQLLite ngầm sử dụng một giao dịch mà khóa một cơ sở dữ liệu bất cứ khi nào thực hiện một DML. Điều này có nghĩa rằng các truy cập đồng thời khác vào cơ sở dữ liệu sẽ đợi cho đến khi yêu cầu DML thực thi hoàn tất bằng cách commit/quay trở lại một giao dịch. Tuy nhiên, lưu ý rằng nhiều quy trình có thể thực hiện SELECT cùng một lúc.

Ngoài ra, vui lòng tham khảo Python SQL Lite 3.0 module trong phần 11.13.6 - Kiểm soát giao dịch chi tiết cách thức giao dịch có thể được kiểm soát.

Các vấn đề liên quan