Trong mã Rails của tôi, tôi cần xác nhận rằng một hành động chỉ được phép nếu có nhiều hơn 1 bản ghi còn lại. Vì lý do này, tôi cần phải khóa cập nhật và sau đó thực hiện đọc. Mã đường ray của tôi trông giống như sau:Đường ray + MySQL + Giao dịch + Khóa, làm cách nào để ngăn chặn mở giao dịch khỏi mở khóa bảng?
PaymentProfile.transaction do
profiles = PaymentProfile.lock("LOCK IN SHARE MODE").where(user_id: xxx)
if profiles.count > 1
#allow
else
#do not allow
end
end
Về lý thuyết hoạt động tốt và khóa các hàng chính xác. HÃY BAO GIỜ, nếu một yêu cầu khác đi qua cùng một đường dẫn mã mở giao dịch sẽ xóa khóa tôi đã lấy ra trong quá trình khác, do đó sẽ đánh bại mục đích của khóa.
Từ các tài liệu MySQL:
Beginning a transaction also causes table locks acquired with LOCK TABLES to be released, as though you had executed UNLOCK TABLES. Beginning a transaction does not release a global read lock acquired with FLUSH TABLES WITH READ LOCK.