2012-06-06 19 views
6

Tôi có một chương trình java cập nhật một bảng trong MS SQL. Bảng này cũng được truy cập bởi người dùng web thông qua một trang web được tạo ra trong ColdFusionGiao dịch (ID tiến trình) đã bị khóa trên khóa | tài nguyên đệm giao tiếp với một quy trình khác và đã được chọn làm nạn nhân bế tắc

Gần đây tôi đã nhận được lỗi này khi dòng:

sql_stmt.executeUpdate("update random_selection " 
    + "set forecasted = 1 where " 
    + " randnum = " + ora_rs.getString("RANDNUM") 
    + " and quarter = " + quarter 
    + " and ozip3 = " + ora_rs.getString("OZIP3")); 

Truy vấn CF được erroring là:

<cfquery name="submit_forecast" datasource="ttmsdropper" username="#request.db_username#" password="#request.db_password#"> 
    INSERT INTO forecast_entry 
    VALUES (<cfqueryparam value="#currentRecord[8]#">) 
</cfquery> 

Điều gì gây ra lỗi này và làm cách nào để khắc phục lỗi này?

Trả lời

12

Bế tắc xảy ra khi 2 quy trình cố gắng truy cập cùng một dữ liệu cùng một lúc - cả hai đều có xác nhận quyền sở hữu ngang nhau về dữ liệu. Nó phổ biến nhất khi có rất nhiều hoạt động cập nhật/chèn đang diễn ra (như bạn mô tả). Hệ thống DB "chọn" một trong các giao dịch là "người chiến thắng".

Trong một số trường hợp, các khóa chết có thể được cải thiện hoặc giảm thiểu bằng cách lập chỉ mục nhưng chỉ khi lựa chọn có liên quan - một chiến lược lập chỉ mục tốt có thể cải thiện hiệu suất được chọn và khóa hàng hiệu quả hơn. Tuy nhiên, trong trường hợp bế tắc đến từ một chèn cạnh tranh với một bản cập nhật, lập chỉ mục sẽ KHÔNG giúp đỡ. Thật vậy, việc lập chỉ mục tích cực có thể làm suy giảm tình hình vì các chỉ mục phải được cập nhật cùng với các chèn hoặc cập nhật dữ liệu.

Cách giải quyết rất nhiều phụ thuộc vào hệ thống của bạn và những gì bạn đang cố gắng làm. Bạn phải giảm thiểu việc chèn/cập nhật khóa hoặc cung cấp tài nguyên nhiều hơn hoặc nhanh hơn bằng cách nào đó. Bundling chèn với nhau và batching chúng, procs nhiều hơn hoặc RAM (đôi khi - không phải luôn luôn), clustering, tách bảng và dữ liệu, tinh chỉnh song song - tất cả những điều này có thể là lựa chọn khả thi. Và không có quy tắc cứng nhắc và nhanh chóng.

+1

Để làm rõ cho bất kỳ ai có thể gặp phải bài đăng này, bế tắc không thể xảy ra với một điểm tranh chấp duy nhất. Nó chỉ có thể xảy ra khi có (ít nhất) hai điểm tranh chấp và một quy trình khóa một điểm đầu tiên và sau đó tiến trình kia và các quy trình khác sẽ khóa chúng theo thứ tự ngược lại. Xem định nghĩa của [deadlock] (https://en.wikipedia.org/wiki/Deadlock). – James

+0

Awesome James - cảm ơn bạn! –

1

Nếu không bao giờ cập nhật bảng (chỉ chèn) thì bạn có thể muốn thử thay đổi lựa chọn - không có khóa hoặc gói được chọn trong cftransation readuncommited.

Vì Mark cho biết đây là lỗi DB không phải ColdFusion và khóa đang diễn ra. Nếu có các lựa chọn và cập nhật phức tạp, hãy thêm các chỉ mục vào các cột khoản.

+0

Tôi nghĩ về việc gợi ý rằng - gợi ý tốt. Tôi chỉ có ấn tượng rằng java dựa trên "cập nhật" của mình đã can thiệp vào CF của mình dựa trên "chèn" :) –

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