2012-01-20 32 views
5

chương trình mà tôi đang làm việc lấy dữ liệu từ một dịch vụ web, thêm dữ liệu vào cơ sở dữ liệu, xóa và cập nhật. Nhưng đôi khi khi tôi chạy ứng dụng của tôi tất cả các hành động thành công nhưng đôi khi khi tôi muốn thêm, xóa hoặc cập nhật dữ liệu tôi nhận được lỗi này.Tệp cơ sở dữ liệu bị khóa

Máy chủ không thể xử lý yêu cầu. ---> Tệp cơ sở dữ liệu bị khóa cơ sở dữ liệu bị khóa

Tôi không thể hiểu cùng một chương trình tại một thời điểm nào đó hoạt động tốt nhưng một lúc nào đó chương trình này đưa ra thông báo này.

+0

Bạn đang sử dụng công cụ cơ sở dữ liệu nào? Bạn đã kiểm tra nhật ký cơ sở dữ liệu chưa? –

+0

bạn đang kết nối với cơ sở dữ liệu nào? MS Access .mdb tệp hoặc SQL Server? Bạn cũng có thể hiển thị chuỗi kết nối không? –

+0

Bạn sẽ cần phải cung cấp thêm chi tiết về cơ sở dữ liệu bạn đang sử dụng và cách bạn truy cập vào cơ sở dữ liệu đó. –

Trả lời

5

SqlLite không cho phép hai chủ đề sử dụng cơ sở dữ liệu cùng một lúc.

Cách dễ nhất để giải quyết là sử dụng câu lệnh lock xung quanh tất cả các cuộc gọi cơ sở dữ liệu.

+1

nhưng vấn đề là tôi có 4 cơ sở dữ liệu như vậy trên trang web của tôi tất cả các ứng dụng khác liên quan đến chúng đang hoạt động tốt nhưng chỉ ứng dụng này không hoạt động với dịch vụ web. Không làm việc có nghĩa là đôi khi nó hoạt động và đôi khi cùng một ứng dụng đưa ra lỗi như tôi đã đề cập. –

+0

Bạn đã thử tải thử nghiệm các trang web khác của mình chưa? Họ sẽ sớm gặp phải vấn đề này. Bạn có thể đang cố sử dụng nhiều kết nối db cho cùng một yêu cầu HTTP trong webservice? – jgauffin

3

Bạn có sử dụng cơ sở dữ liệu dựa trên tệp như Access không?

Tệp cơ sở dữ liệu luôn bị khóa (trong hầu như tất cả hệ thống cơ sở dữ liệu), hãy thử dừng dịch vụ cơ sở dữ liệu để mở khóa tệp.

+0

Tôi đang sử dụng tệp cơ sở dữ liệu sqLite . Làm thế nào một dịch vụ web có thể làm điều đó có nghĩa là dừng tệp để mở khóa? –

4

Có một gói tuyệt vời được gọi là SysInternals. một trong những thành phần bên trong là Process Monitor (procmon). Sử dụng nó để kiểm tra ứng dụng nào khóa các tệp cơ sở dữ liệu của bạn và nếu 2 trường hợp ứng dụng của bạn "chiến đấu" về việc khóa các tệp DB.

Trong nhiều quá trình Sqlite có thể đọc từ tệp DB, nhưng chỉ có một quy trình được phép thực hiện thay đổi (INSERT/UPDATE/DELETE) tại một thời điểm nhất định. nếu có nhiều quá trình đang cố thay đổi DB trong cùng một thời điểm, bạn sẽ gặp phải lỗi này. bạn có thể sử dụng Mutex để đồng bộ giữa các quá trình truy cập DB.

BTW, tài liệu sqlite khuyên bạn nên tránh sử dụng cơ sở dữ liệu từ nhiều luồng. để đảm bảo chỉ một luồng sẽ truy cập DB cùng một lúc, bạn có thể tạo một lớp tĩnh sẽ thực hiện tất cả tương tác với cơ sở dữ liệu và sử dụng các lệnh khóa bên trong lớp này để tránh truy cập DB từ nhiều luồng cùng một lúc.

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