Имеют ли крупные транзакции линейно или экспоненциально увеличивающуюся стоимость производительности / ресурсов? - PullRequest
7 голосов
/ 17 июня 2011

У меня очень общий вопрос:

1.) Учитывая, что у меня есть транзакция (в mysql), которая включает в себя изменение десяти / ста тысяч или даже миллионов записей. Являются ли такие транзакции линейно дорогими по сравнению с очень «маленькой» транзакцией? Или большая транзакция потребляет экспоненциально больше ресурсов, чем маленькая транзакция? (другими словами, следует избегать).

2.) Правда ли, что при совершении такой большой транзакции нагрузка на mysql будет переходить к очень высокому значению, пока транзакция не будет полностью обработана?

Вопрос касается в основном MySQL, но если есть серверы, которые "намного лучше", чем было бы интересно о них услышать. И да, Сервер / Система имеет небольшую нагрузку от других процессов (так что это не единственная транзакция, обрабатываемая в системе = средняя / высокая конкуренция). А уровни изоляции являются «более высокими / самыми высокими» уровнями изоляции (которые приносят все преимущества реальных транзакций).

Большое спасибо

1 Ответ

2 голосов
/ 18 июня 2011

Это не полный ответ, я надеюсь, что кто-то даст вам несколько полезных советов по этому вопросу.

Но я могу дать вам хотя бы один совет.

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

Если мы говорим об изменении всех строк таблицы миллионов строкв сериализуемой транзакции вам, безусловно, придется поставить блокировку уровня приложения или семафор, нечто большее, чем транзакция базы данных, чтобы сообщить другим процессам, что вы выполняете тяжелую задачу, и что они должны немного подождать и позволить вам сделать этоважная задача: -)

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

...