Как бы вы решили проблему параллелизма с помощью следующего кода? В этом примере мы хотели бы узнать , почему пользователь не прошел аутентификацию. Проблема в том, что этот код выполняет два отдельных вызова базы данных, но мы бы хотели, чтобы весь метод происходил внутри концептуальной транзакции. В частности, мы заинтересованы в изоляции . Мы не хотим, чтобы одновременные записи во время выполнения этого метода влияли на наши чтения до того, как мы определили причину сбоя аутентификации.
На ум приходит несколько решений: Блокировка потоков , TransactionScope и Оптимистическая блокировка . Мне действительно нравится идея «Оптимистичной блокировки», так как я думаю, что конфликты, скорее всего, будут редкими, но в .NET нет ничего, чтобы сделать это, верно?
Кроме того - действительно ли это чем-то действительно нужно заниматься в этом случае? Когда такие вопросы параллелизма, как это важно рассмотреть, а когда нет? Что необходимо учитывать при реализации решения? Спектакль? Продолжительность блокировки? Насколько вероятны конфликты?
Редактировать: После рассмотрения ответа Аристоса, я думаю, что на самом деле мне нужен какой-то уровень изоляции snapshot для метода Authenticate.
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;
}