Как лучше обходить блокировки?

Здравствуйте.
Есть у меня на сервере обработчики запросов от клиентов. Просиходит примерно так:
Запрос
{
	НачалоТранзакции (IsolationLevel=Snapshot)
	{
		try
		{
			repo.UserRepo.ChangeSomething(..);
			repo.ShipRepo.ChangeSomething(..);
			repo.BuildingRepo.ChangeSomething(..);
			...

			SaveChanges(); 
			Commit();
		}
		catch
		{
			Rollback();
			!!! Если произошла взаимоблокировка в транзакции, то повторить транзакцию заново
		}
	}
}


В итоге если взаимоблокировка произошла, то эта транзакция откатывается и пробует ещё раз.
Пока всё нормально работает. Иногда случаются взаимоблокировки. Но чем больше становится запросов от пользователей, тем больше взаимоблокировок (=тормоза)

Есть ли решения? Изучал разные способы, но не знаю как применить в моём случае.
  • Вопрос задан
  • 273 просмотра
Решения вопроса 1
@lega
* Делайте очереди в разрезе пересекающихся изменяемых данных
или
* Делать локи (SELECT WITH LOCK) на пересекающиеся изменяемые ресурсы

Так же оптимизируйте операции - чем быстрее работают тем меньше конфликтов.
При больших нагрузках можно пробовать 2-х фазый комит, шардинг, партицирование.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы