У меня есть несколько консольных приложений, но они будут читать и вставлять обновления одной и той же таблицы sql. Я использовал транзакцию, но получаю эту ошибку «Транзакция (идентификатор процесса) была заблокирована на ресурсах блокировки с другим процессом и была выбрана в качестве жертвы взаимоблокировки. Повторно запустите транзакцию».
Я получаю исключение в своем блоке catch. Как я могу этого избежать? Я знаю, в чем проблема, но я не уверен, каким должно быть возможное решение. Я вижу много вопросов, которые задают на разных форумах, но ни один из них не помог мне.
Все ли хорошо в моем коде?
bool isMaster = false;
tourneyInstanceTrackerId = 0;
using (JG_RummyEntities dbContext = new JG_RummyEntities())
{
try
{
using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required,new TransactionOptions { IsolationLevel = IsolationLevel.RepeatableRead }))
{
bool isAnyMaster = dbContext.TourneyInstanceTrackers.Any(t => t.IsMaster & t.TournamentId == tournamentId);
TourneyInstanceTracker tourneyInstanceTracker = new TourneyInstanceTracker
{
TournamentId = tournamentId,
IsMaster = !isAnyMaster,
CreateDate = DateTime.Now
};
dbContext.AddToTourneyInstanceTrackers(tourneyInstanceTracker);
dbContext.SaveChanges();
var result = dbContext.TourneyInstanceTrackers.Where(t => t.TournamentId == tournamentId)
.OrderByDescending(t => t.CreateDate)
.Select(t => new { t.IsMaster, t.Id })
.FirstOrDefault();
if (result != null)
{
isMaster = result.IsMaster;
tourneyInstanceTrackerId = result.Id;
}
transaction.Complete();
}
}
catch (Exception ex)
{
Logger.Log("Got exception in SetTournamentInTourneyInstanceTracker : " + ex.Message + ", " + ex.StackTrace + ", "+ tournamentId);
}
}