public async Task <string> CreateTransaction(int userId, CreateTransactionModel transactionModel) { var semaphore = dictionary.GetOrAdd(userId, new SemaphoreSlim(1, 1)); await semaphore.WaitAsync(); try { var balance = await _balanceRepository.GetBalance(userId); if (balance < transactionModel.Amount) { return(ErrorDictionary.BalanceSmallerThenAmount); } var date = DateTime.UtcNow; var transactionId = await AddTransaction(userId, (int)transactionModel.CorrespondentId, date); var negativeBalance = new Balance(); var positiveBalance = new Balance(); negativeBalance.Amount = -(int)transactionModel.Amount; positiveBalance.Amount = (int)transactionModel.Amount; negativeBalance.CreationDate = positiveBalance.CreationDate = date; negativeBalance.TransferTransactionId = positiveBalance.TransferTransactionId = transactionId; negativeBalance.UserId = userId; positiveBalance.UserId = (int)transactionModel.CorrespondentId; var result = await _balanceRepository.AddBalanceEntries(new List <Balance>() { negativeBalance, positiveBalance }); if (result.All(c => c.Id > 0)) { return(ErrorDictionary.Ok); } else { await _balanceRepository.RemoveBalanceEntry(result.FirstOrDefault(c => c.Id > 0)); await _transferTransactionRepository.RemoveTransaction(transactionId); return(ErrorDictionary.Error); } } finally { semaphore.Release(); } }