Tôi có đoạn mã sau trong một mô hình đường ray:Cơ sở dữ liệu khóa không làm việc như mong đợi với Rails & Postgres
foo = Food.find(...)
foo.with_lock do
if bar = foo.bars.find_by_stuff(stuff)
# do something with bar
else
bar = foo.bars.create!
# do something with bar
end
end
Mục đích là để đảm bảo rằng một Bar của các loại được tạo ra không được tạo ra hai lần.
Kiểm tra with_lock hoạt động tại bảng điều khiển xác nhận mong đợi của tôi. Tuy nhiên, trong sản xuất, có vẻ như trong một số hoặc tất cả các trường hợp khóa không hoạt động như mong đợi, và thanh dự phòng đang được thử - vì vậy, with_lock không (luôn luôn?) Dẫn đến mã chờ đến lượt nó .
Điều gì có thể xảy ra ở đây?
cập nhật rất tiếc cho tất cả những người đã nói "khóa foo sẽ không giúp bạn" !! ví dụ của tôi ban đầu không có tra cứu thanh. điều này đã được khắc phục ngay bây giờ.
Bạn kiểm tra xem thanh đã tồn tại ở đâu? –
@FrederickCheung: Tại sao bạn lại bận tâm kiểm tra? Bất kỳ kiểm tra nào bên ngoài cơ sở dữ liệu sẽ ** luôn luôn ** có lỗ và điều kiện chủng tộc. –
Cá nhân tôi sẽ không nhưng nó có thể hữu ích cho OP để làm việc ra mà bit của sự hiểu biết của họ là thiếu sót. –