2012-01-23 30 views
6

Chúng tôi đang nhận được trường hợp ngoại lệ như thế nàyC3P0 - bế tắc rõ ràng về MSSQL, nhưng không PostgreSQL hoặc MySQL

com[email protected]5b7a7896 -- APPARENT DEADLOCK!!! Complete Status: 
Managed Threads: 3 
Active Threads: 3 
Active Tasks: 
    co[email protected]55bc5e2a (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1) 
    co[email protected]41ca435f (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2) 
    co[email protected]460d33b7 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0) 
Pending Tasks: 

khi tải thử nghiệm ứng dụng của chúng tôi trên MSSQL 2008 R2 (jTDS hoặc chính thức MS JDBC không quan trọng) . Chúng tôi không bao giờ nhận được ngoại lệ này khi chạy các thử nghiệm tương tự đối với PostgreSQL hoặc MySQL.

Chúng tôi không chỉ muốn tăng số lượng chuỗi trợ giúp cho c3p0 (giải quyết được vấn đề, nhưng trong bao lâu?). Chúng tôi muốn biết vấn đề là gì khi nó hoạt động với các DBMS khác '.

Các ứng dụng hoạt động như:

  • Gửi X yêu cầu
  • Chờ một thời gian -> bế tắc
  • Gửi X yêu cầu
  • Chờ một thời gian -> bế tắc

Có ai biết hoặc có một ý tưởng tại sao chúng ta có hành vi này với MSSQL?

Cảm ơn, Adrian

(Btw. BoneCP hoạt động mà không có vấn đề gì quá.)

+0

Tiện ích này là gì và tại sao nó báo cáo "bế tắc rõ ràng" thay vì bế tắc thực tế? SQL Server sẽ phát hiện deadlocks thực sự. Bạn có thể theo dõi biểu đồ bế tắc để sau đó chẩn đoán lý do tại sao nó xảy ra. –

+0

Xin chào, bản thân Máy chủ SQL không bị lỗi. Có vẻ như chỉ là c3p0 (một kết nối tổng hợp lib cho Java) giả định có một bế tắc. – Adrian

+0

Adrian - bạn có thể làm rõ việc sử dụng BoneCP có tránh được vấn đề không? – tgdavies

Trả lời

3

SQL Server có nhiều hạn chế hơn chiến lược khóa so với PostgreSQL hoặc InnoDB.

Đặc biệt nó sẽ chặn các lệnh SELECT trên hàng (bảng?) Được cập nhật từ một kết nối/giao dịch khác (trong cài đặt mặc định).

Bạn nên đảm bảo rằng bạn không chọn cùng một hàng trong một phiên đang được cập nhật từ một phiên khác.

Nếu bạn không thể thay đổi thứ tự mã của mình, bạn có thể lấy đi bằng cách sử dụng "lần đọc bẩn" trong SQL Server.

Nếu tôi nhớ rằng một cách chính xác, điều này được thực hiện bằng cách thêm WITH NOLOCK minh báo cáo SELECT (nhưng tôi không hoàn toàn chắc chắn)

Sửa
Một khả năng khác nhau (nếu bạn đang ở trên SQL Server 2005 hoặc sau này) sẽ sử dụng "cách ly ảnh chụp nhanh" mới để tránh chặn các lựa chọn.

+0

SQL Server cũng có cách ly ảnh chụp nhanh. –

+1

@MartinSmith: Tôi biết. Đó là lý do tại sao tôi nói "cài đặt mặc định". Nhưng bạn có một điểm ở đó: việc chuyển sang chế độ cô lập ảnh chụp cũng có thể giải quyết vấn đề đó. –

+0

Bạn không nói "cài đặt mặc định". Có lẽ bạn nghĩ nó! –

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