Bạn sẽ giải quyết vấn đề tương tranh với mã sau đây như thế nào? Trong ví dụ này, chúng tôi muốn biết lý do tại sao xác thực người dùng không thành công. Vấn đề là mã này thực hiện hai cuộc gọi riêng biệt với cơ sở dữ liệu, nhưng chúng tôi muốn toàn bộ phương thức xảy ra bên trong một giao dịch khái niệm. Cụ thể, chúng tôi quan tâm đến số isolation. Chúng tôi không muốn đồng thời viết trong khi thực hiện phương pháp này để ảnh hưởng đến lần đọc của chúng tôi trước khi chúng tôi xác định lý do cho lỗi xác thực.Sự cố đồng thời với nhiều giao dịch cơ sở dữ liệu độc lập?
Một vài giải pháp cần lưu ý: Thread Locking, TransactionScope và Optimistic Locking. Tôi thực sự thích ý tưởng Khóa lạc quan, vì tôi nghĩ rằng xung đột có thể hiếm, nhưng không có gì được tích hợp vào .NET để làm điều này, đúng không?
Ngoài ra - đây có phải là điều gì đó thực sự lo ngại về trường hợp này không? Khi có các vấn đề tương tranh như thế này thì điều quan trọng cần xem xét và khi nào thì chúng? Những gì cần phải được xem xét trong việc thực hiện một giải pháp? Hiệu suất? Thời lượng của khóa? Khả năng xung đột sẽ xảy ra như thế nào?
Chỉnh sửa: Sau khi xem xét câu trả lời của Aristos, tôi nghĩ rằng những gì tôi thực sự sau là một số loại "snapshot" mức cách ly cho phương thức Xác thực.
public MembershipStatus Authenticate(string username, string password)
{
MembershipUser user = Membership.GetUser(username);
if (user == null)
{
// user did not exist as of Membership.GetUser
return MembershipStatus.InvalidUsername;
}
if (user.IsLockedOut)
{
// user was locked out as of Membership.GetUser
return MembershipStatus.AccountLockedOut;
}
if (Membership.ValidateUser(username, password))
{
// user was valid as of Membership.ValidateUser
return MembershipStatus.Valid;
}
// user was not valid as of Membership.ValidateUser BUT we don't really
// know why because we don't have ISOLATION. The user's status may have changed
// between the call to Membership.GetUser and Membership.ValidateUser.
return MembershipStatus.InvalidPassword;
}
Tôi không chắc chắn rằng bạn thực sự cần phải lo lắng về việc bị cô lập ở đây. Cơ hội người dùng sẽ bị xóa hoặc bị khóa giữa cuộc gọi với 'GetUser' và' ValidateUser' là gì? Và hơn thế nữa, bạn không nên để lộ thông tin này cho người dùng. Nếu bạn hiển thị các thông báo khác nhau cho "mật khẩu sai" và "người dùng không tồn tại" và "tài khoản bị khóa", ai đó cố gắng hack trang web của bạn có thể tận dụng thông tin đó để có danh sách tên người dùng hợp lệ.Bạn không muốn điều đó, vì những tên người dùng đó có thể hữu ích trong việc khai thác một số lỗ hổng khác trong cơ sở hạ tầng của bạn. –
+1 cho phản hồi. Tôi có thể sử dụng một ví dụ nghèo ở đây (mặc dù tôi đã có kế hoạch phân biệt giữa "thông tin đăng nhập không hợp lệ" và "tài khoản bị khóa" và có lẽ tôi cần suy nghĩ lại). Tôi không thích thực tế là dữ liệu có thể thay đổi bên dưới tôi! Đồng thời là khó! Điều gì sẽ xảy ra nếu tôi CẦN dữ liệu được nhất quán, bạn sẽ đề xuất điều gì? – Brandon