Jak rozwiązać zagadnienie współbieżności za pomocą poniższego kodu? W tym przykładzie chcielibyśmy wiedzieć, , dlaczego użytkownik nie uwierzytelnił się. Problem polega na tym, że ten kod wykonuje dwa oddzielne wywołania do bazy danych, ale chcielibyśmy, aby cała metoda miała miejsce w ramach transakcji pojęciowej. W szczególności interesuje nas isolation. Nie chcemy, aby zapisy współbieżne podczas wykonywania tej metody wpłynęły na nasze odczyty, zanim nie określimy przyczyny niepowodzenia uwierzytelnienia.Kwestie współbieżności z wieloma niezależnymi transakcjami bazy danych?
Kilka rozwiązań przychodzi na myśl: Thread Locking, TransactionScope i Optimistic Locking. Bardzo podoba mi się pomysł Optymistycznego blokowania, ponieważ wydaje mi się, że konflikty są rzadkie, ale nie ma nic wbudowanego w .NET, aby to zrobić, prawda?
Również - czy jest to coś, na co NAPRAWDĘ się martwisz w tym przypadku? Kiedy kwestie współbieżności, takie jak to ważne, należy rozważyć, a kiedy nie są? Co należy wziąć pod uwagę przy wdrażaniu rozwiązania? Wydajność? Czas trwania blokady? Jak prawdopodobne są konflikty?
Edit: Po przeanalizowaniu odpowiedzi Aristos', myślę, że to, co jestem naprawdę po to jakiś «snapshot» poziom izolacji dla metody uwierzytelnić.
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;
}
nie jestem pewien, że naprawdę trzeba się martwić o izolacji tutaj. Jakie są szanse, że użytkownik zostanie usunięty lub zostanie zablokowany między wywołaniem "GetUser" i "ValidateUser"? Co więcej, nie powinno się ujawniać użytkownikom tych informacji. Jeśli wyświetlasz różne komunikaty o "złym haśle" kontra "użytkownik nie istnieje" kontra "konto zablokowane", osoba próbująca włamać się do witryny może wykorzystać te informacje, aby uzyskać listę prawidłowych nazw użytkowników.Nie chcesz tego, ponieważ te nazwy użytkowników mogą być pomocne w wykorzystaniu innej luki w twojej infrastrukturze. –
+1 za odpowiedź. Prawdopodobnie użyłem tutaj słabego przykładu (chociaż planowałem rozróżniać "nieprawidłowe dane uwierzytelniające" i "konto zablokowane" i być może muszę to jeszcze raz przemyśleć). Po prostu nie podoba mi się fakt, że dane mogą się zmienić pode mną! Współbieżność jest trudna! Co, jeśli POTRZEBUJĘ, aby dane były spójne, co byś zasugerował? – Brandon