Khóa lạc quan nghĩa là bạn muốn nhiều chủ đề có thể chỉnh sửa cùng một bản ghi người dùng.
Điều đang xảy ra trong ứng dụng của bạn là hai (hoặc nhiều) chỉnh sửa đang diễn ra cho cùng một hồ sơ người dùng và ứng dụng của bạn đang phát hiện chính xác và tăng lỗi phù hợp.
Những gì bạn sẽ thường làm là xử lý các lỗi:
Ví dụ, bạn có thể in một thông điệp như "Xin lỗi, người khác thay đổi nội dung này, vì vậy thay đổi của bạn không được cứu rỗi". Ví dụ: bạn có thể mã bất kỳ cách nào để điều chỉnh các chỉnh sửa, chẳng hạn như phát hiện một bản chỉnh sửa đã thay đổi tên của người đó, bất kể bản chỉnh sửa khác đã thay đổi số điện thoại của người đó, và sau đó bạn có thể mã một cách để hợp nhất hai vào một lần lưu.
Nói chung, bạn cũng có thể sử dụng user.reload
để tìm nạp phiên bản mới của người dùng.
Tôi khuyên bạn trước hết nên thử tắt khóa lạc quan, trong khi bạn đang học Rails. Khóa lạc quan là một tối ưu hóa tuyệt vời cho tốc độ, nhưng nó không cần thiết để có được một ứng dụng Rails & Devise điển hình chạy thành công.
Bạn hỏi về những gì đặc biệt Vạch có thể làm:
Khi một hồ sơ người dùng được cập nhật, thiết lập Rails ActiveRecord điển hình cập nhật một lĩnh vực bảng updated_at
với timestamp hiện hành.
Thiết lập Devise điển hình của các mô-đun như trackable
cập nhật hồ sơ người dùng bằng dấu thời gian đăng nhập và/hoặc đăng xuất gần đây nhất.
Một cách dễ dàng để xem những gì đang xảy ra là nhìn vào lĩnh vực lock_version
:
Khi Rails tải một kỷ lục (ví dụ một người sử dụng) sau đó Rails increments số phiên bản lock.
Khi ứng dụng của bạn lưu người dùng, Rails ActiveRecord so sánh số lock_version đối tượng người dùng với số khóa lock_version cơ sở dữ liệu.
Nếu các số phù hợp, thì lưu thành công; nếu số không khớp, thì Rails sẽ tăng ngoại lệ đối tượng cũ.
Ví dụ mã:
def before_logout
logger.debug current_user.lock_version
current_user.reload
logger.debug current_user.lock_version
current_user.update(security_token: nil)
end
lập mưu và một số module khác nhau của nó thêm các trường vào bảng user
. Điều này là nhanh chóng và thuận tiện cho các ứng dụng web điển hình, nhưng các trường được thêm vào này có xu hướng làm gián đoạn bộ nhớ đệm, khóa, kiên trì, tuần tự hóa và tương tự.
(Ngoài ra, bạn có thể cân nhắc việc đánh giá Devise so với các giải pháp bảo mật khác. Một đặc biệt mà tôi thích được gọi là Sorcery, nó cung cấp một bộ công cụ của một số phương pháp mà bạn có thể lắp ráp theo cách bạn muốn. Theo kinh nghiệm cá nhân của tôi, Sorcery là một cách tuyệt vời để tìm hiểu chính xác từng bước đang làm trong mã của riêng bạn, và bạn có thể kiểm soát bộ nhớ đệm và khóa theo những cách bạn muốn.)
Cảm ơn, Joel. Tôi khá rõ ràng về những gì khóa lạc quan là, nếu không tôi sẽ không được sử dụng nó.Tôi không đồng ý rằng nó được sử dụng chủ yếu cho tối ưu hóa tốc độ và không cần thiết. Như bạn đã nói, nó được sử dụng để bảo vệ thread, mà tôi đang sử dụng trong các phần khác nhau của mã của tôi để xử lý các trường hợp khi hai chủ đề đang sửa đổi cùng một đối tượng, vì vậy tôi ghét phải tắt nó đi. Câu hỏi của tôi là những gì có thể gây ra ngoại lệ đối tượng cũ được ném khi Devise đăng xuất, hoặc một số cách tôi có thể theo dõi nó là gì. Nó không liên tục, nó xảy ra trên mỗi lần đăng xuất. Cảm ơn một lần nữa. – BeachRunnerFred
(Đã thêm thông tin cho bạn) – joelparkerhenderson