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();
            }
        }