Tôi đang tìm một chiến lược tốt về xử lý các deadlocks cơ sở dữ liệu từ bên trong một ứng dụng Java 6; một số chủ đề song song có thể, có khả năng, viết vào cùng một bảng cùng một lúc. Cơ sở dữ liệu (Ingres RDMBS) sẽ ngẫu nhiên giết một trong các phiên nếu nó phát hiện một bế tắc.Đa luồng - Tránh và xử lý các bế tắc cơ sở dữ liệu
Điều gì sẽ là một kỹ thuật có thể chấp nhận để xử lý tình trạng bế tắc, với các yêu cầu sau đây?
- tổng thời gian trôi qua nên được giữ nhỏ như một cách hợp lý có thể
- giết chết một phiên sẽ phải chịu một đáng kể (đo lường) rollback
- đề thời gian không có cách nào để
giao tiếp với nhau tức là chiến lược phải là tự trị
Cho đến nay, chiến lược tôi đưa ra là một cái gì đó dọc theo các dòng sau:
short attempts = 0;
boolean success = false;
long delayMs = 0;
Random random = new Random();
do {
try {
//insert loads of records in table 'x'
success = true;
} catch (ConcurrencyFailureException e) {
attempts++;
success = false;
delayMs = 1000*attempts+random.nextInt(1000*attempts);
try {
Thread.sleep(delayMs);
} catch (InterruptedException ie) {
}
}
} while (!success);
Nó có thể được cải thiện theo bất kỳ cách nào không? ví dụ. chờ một số tiền cố định (số ma thuật) giây. Có một chiến lược khác sẽ tạo ra kết quả tốt hơn không?
Lưu ý: Một số kỹ thuật cấp cơ sở dữ liệu sẽ được sử dụng để đảm bảo deadlocks, trên thực tế, rất hiếm. Ngoài ra, ứng dụng sẽ cố gắng tránh lập kế hoạch các luồng ghi vào cùng một bảng cùng một lúc. Tình huống trên sẽ chỉ là "kịch bản xấu nhất".
Lưu ý: Bảng trong đó các bản ghi được chèn vào được tổ chức dưới dạng bảng phân đoạn heap và không có chỉ mục; mỗi luồng sẽ chèn các bản ghi vào phân vùng riêng của nó.
Hàm mũ âm thanh tốt - Tôi sẽ cố gắng mô phỏng nó! Như tôi đã đề cập trong ghi chú, thiết kế ứng dụng sẽ nhằm mục đích tránh deadlocks, bao gồm việc sắp xếp truy cập cơ sở dữ liệu một cách thuận lợi. Nhưng không có gì đảm bảo rằng, trong các trường hợp góc, một số lượng lớn các bế tắc sẽ xảy ra. – Adrian
Bạn có thể cung cấp bất kỳ tham chiếu kỹ thuật nào cho kỹ thuật "trả về số mũ" mà bạn đề cập không? – Adrian
Nó thường được sử dụng trong các giao thức mạng để tránh tắc nghẽn. Kiểm tra bài viết wiki: http://en.wikipedia.org/wiki/Exponential_backoff Nhưng ý tưởng cơ bản thì đơn giản. Bạn chỉ cần sử dụng một số loại hàm mũ để xác định độ trễ tại mỗi lần thử lại. Các chi tiết chính xác có thể được điều chỉnh cho phù hợp với mục đích của bạn. Tất nhiên việc thực hiện đơn giản nhất có thể là trì hoãn 2^n ms trong đó n là số lần thử lại cho đến nay.Nhưng có lẽ bạn nghĩ rằng phát triển quá chậm để bắt đầu, hoặc bắt đầu quá thấp, hoặc phát triển quá nhanh. Sau đó, bạn chỉ cần thêm một số nhân, hoặc thêm một cái gì đó để n – jalf