2008-12-18 19 views
7

Tôi đã gặp một vấn đề lạ về sqlite3. Tôi thu được các kết nối khác nhau của cùng một tệp cơ sở dữ liệu bằng cách sử dụng phương thức open(). kết nối 1 bắt đầu một giao dịch và kết nối 2 bắt đầu một giao dịch khác, đó là cập nhật một số bản ghi của một bảng. Sau đó kết nối 1 cam kết giao dịch, tiếp theo là kết nối 2 cam kết giao dịch của nó. Nhưng tôi thấy rằng lệnh cập nhật của kết nối 2 không bao giờ thực sự cập nhật bản ghi trong cơ sở dữ liệu. Không có ngoại lệ nào được ném trong quy trình này. Tôi không biết tại sao vấn đề lại xảy ra. Bất cứ ai có thể giải thích lý do cho tôi?Các kết nối khác nhau của cùng một cơ sở dữ liệu của sqlite có bắt đầu giao dịch đồng thời không?

Trả lời

14

Nếu bạn đọc tài liệu SQLite, bạn sẽ thấy nó hỗ trợ nhiều kết nối chỉ đọc, bạn không thể ghi vào cơ sở dữ liệu từ kết nối mulitple, vì nó không được thiết kế cho điều đó.

http://www.sqlite.org/faq.html#q5

+1

Tuy nhiên, bạn có thể có hai giao dịch ghi đồng thời, đó là nguyên nhân gây ra sự cố. –

+0

Vì vậy, nếu có một giao dịch thực hiện thao tác ghi vào cơ sở dữ liệu, bất kỳ thao tác ghi nào khác cũng không thể sửa đổi cơ sở dữ liệu, bất kể các hoạt động này nằm trong một giao dịch hay không? – user26404

+0

Tôi có thể thực hiện thao tác chọn khi có kết nối khác thực hiện thao tác ghi (chèn, cập nhật) cùng một lúc không? – user26404

5

Trừ khi bạn sử dụng BEGIN NGAY để bắt đầu giao dịch, bạn có nguy cơ phải rollback và thử chúng. BEGIN không thực hiện bất kỳ khóa nào; UPDATE hoặc INSERT tiếp theo nhận khóa và bạn cần kiểm tra mã kết quả để xem chúng có bị lỗi không. Xem trang này trên transactions và trang này trên locks.

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