2011-02-06 31 views
5

Trong bản ghi hoptoad tôi kỳ sẽ thấyMysql thoáng qua :: Lỗi: Nhập trùng lặp trên trang web có lưu lượng truy cập cao - bất kỳ ý tưởng nào?

Mysql::Error: Duplicate entry 'XXXX' for key 'YYY'

Điều này xảy ra đối với hầu hết các mô hình của tôi, khoảng 6 trong tất cả, và tôi sẽ thấy lỗi này một lần mỗi vài giờ trên một trang web làm về các yêu cầu 5k/phút theo đến newrelic.

Tôi đang thực hiện ActiveRecord.find_or_initialize_by trong mỗi trường hợp này. Có thể, nhưng không chắc, điều này là từ một khách hàng trong lĩnh vực thực hiện hai bài viết cùng một lúc của cùng một dữ liệu, bởi vì đây là những khách hàng di động và codepath không thực sự cho chính nó (tức là, đây không phải là khách hàng nhấp chuột một nút gửi nhanh gấp hai lần).

Có sự cố đã biết với find_or_initialize_by không? Là nó có thể mysql dụ của tôi (Amazon RDS) là tất cả vì vậy thường chỉ bong ra (mặc dù tôi sẽ mong đợi nó để nâng cao một ngoại lệ trong trường hợp đó so với trở về không có dữ liệu) ...

Hơn nữa, là có một cách tốt hơn để chèn hồ sơ? Nếu hồ sơ tồn tại, tôi thường chỉ cập nhật trường updated_at của nó.

Cảm ơn!

Trả lời

1

Điều này rất có thể xảy ra vì "kiểm tra tính hợp lệ khi chèn" không phải là hoạt động nguyên tử. Không có gì đảm bảo rằng người khác không thể chèn một hàng có cùng giá trị cho một cột duy nhất ở giữa kiểm tra tính hợp lệ và chèn.

Các official docs đề cập đến điều này, nhưng chỉ trong qua, và họ thực sự không giải thích nó rất tốt. Rails Warts có trang tốt hơn về vấn đề này.

Và có vẻ như bạn đang ủng hộ điều kiện duy nhất với chỉ số duy nhất trong DB của mình, bạn đã làm những gì có thể để ngăn chặn nó ở phía DB. Và tôi không chắc liệu find_or_initialize_by/ON DUPLICATE KEY UPDATE có phải là một ý tưởng hay không - nó phụ thuộc vào những gì người dùng của bạn đang chỉnh sửa và hậu quả an ninh của việc họ chỉnh sửa thứ gì đó mà họ không nhất thiết có ý định.

Hy vọng điều này sẽ hữu ích!

+0

Cảm ơn thông tin .... bạn có lẽ đúng, tôi đoán rằng về lý thuyết có thể là nếu có bất kỳ độ trễ nào trong một trong các hoạt động DB của tôi và người dùng lặp lại một hành động nào đó, tôi có thể kích hoạt hành vi này. Tôi không nhìn thấy nó thường xuyên ít nhất (một lần mỗi vài giờ nó có vẻ làm hàng ngàn yêu cầu/phút). Tôi đọc bài đăng trên blog Rails Warts, tôi đang làm những gì anh ấy và bạn đề xuất (sao lưu nó bằng kiểm tra tính hợp lệ của DB), vì vậy tôi cho rằng điều đó tốt như bây giờ .... – esilver

0

Tôi có trang web này sinograms.com. Tôi là màn hình trang web tin tức khan hiếm để phân loại ký tự Trung Quốc thông qua tần số và tôi đã tìm thấy những thứ tương tự như bạn sắp tới.

Tôi đã trải qua nhiều giai đoạn. Phiên bản hiện tại chỉ là thử nghiệm cuối cùng và nó chỉ có vài triệu chỉ mục. Chúng trùng lặp dường như xuất hiện một cách nhanh chóng; tôi biết điều này bởi vì tôi chỉ tìm thấy bản sao của các ký tự Trung Quốc rất phổ biến hoặc được lập chỉ mục thường xuyên nói cách khác.

+0

Có vẻ như bạn chưa tìm thấy giải pháp hoặc nguyên nhân? Và rõ ràng, bạn đang chạy một ứng dụng ruby ​​với ActiveRecord, phải không? FWIW Tôi đang chạy một ứng dụng ruby ​​với Sinatra, chứ không phải đường ray. – esilver

+0

Đường ray và AR. Họ đang sử dụng cùng một đá quý phải không? nên nó có liên quan. – s84

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