Увеличивают ли транзакции накладные расходы на БД?

Будет ли добавлено накладных расходов размещение транзакций БД вокруг каждого отдельного метода службы в нашем приложении?

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

Мне кажется, что автоматическая фиксация - это то же самое, что транзакция с точки зрения БД. Но так ли это?

БД: MySQL


person David Parks    schedule 14.02.2012    source источник


Ответы (3)


Вы правы, при автокоммите каждый оператор оборачивается в транзакцию. Если ваши методы службы выполняют несколько операторов sql, было бы хорошо превратить их в транзакцию. Взгляните на this ответ для получения дополнительных сведений и здесь хороший пост в блоге на эту тему.

И чтобы ответить на ваш вопрос, да, транзакции добавляют накладные расходы на производительность, но в вашем конкретном случае вы не заметите разницы, так как у вас уже включен автокоммит, если у вас нет длительных операторов в методах обслуживания, что приведет к более длительным блокировкам таблиц. участие в сделках. Если вы просто заключите несколько операторов внутри транзакции, вы получите одну транзакцию (вместо транзакции для каждого отдельного оператора), как указано здесь (" Сеанс, в котором включена автоматическая фиксация, может выполнить транзакцию с несколькими операторами, запустив ее с явным оператором START TRANSACTION или BEGIN и завершив ее с помощью оператора COMMIT или ROLLBACK "), и вы достигнете атомарности на уровне метода обслуживания ...

В конце я бы выбрал ваше решение, если это имеет смысл с точки зрения достижения атомарности на уровне метода обслуживания (что, я думаю, вы хотите достичь), но есть + и - эффекты на производительность, в зависимости от вашего запросы, запросы / с и т. д.

person Aleksandar Vucetic    schedule 14.02.2012

Да, они могут добавить накладные расходы. Дополнительная «бухгалтерия», необходимая для изоляции транзакций друг от друга, может стать значительной, особенно если транзакции остаются открытыми в течение длительного времени.

person Community    schedule 14.02.2012

Короткий ответ: это зависит от типа вашего стола. Если вы используете MyISAM, по умолчанию, на самом деле транзакций нет, поэтому это не должно влиять на производительность.

Но вы все равно должны их использовать. Без транзакций нет разграничения работы. Если вы обновитесь до InnoDB или реальной базы данных, такой как PostgreSQL, вы все равно захотите добавить эти транзакции в свои методы обслуживания, так что вы можете сделать это привычкой сейчас, пока это вам ничего не стоит.

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

Как и все, что касается баз данных, единственный окончательный ответ - это тестирование с реалистичными данными и реалистичными нагрузками. Я рекомендую делать это всегда, независимо от того, что вы подозреваете, потому что, когда дело доходит до баз данных, активируются очень разные пути кода, когда данные большие, а когда нет. Но я сильно подозреваю, что стоимость использования транзакций даже с InnoDB невелика. В конце концов, эти системы интенсивно используются постоянно, каждый день большими и маленькими организациями, которые зависят от успешной работы транзакций. MVCC добавляет очень мало накладных расходов. Преимущества огромны, затраты низкие - используйте их!

person Daniel Lyons    schedule 14.02.2012
comment
Мы используем InnoDB, и я не теряю аргумент, мне просто нужно найти доказательства того, что это не вызовет проблемы с производительностью. Возможно, тестирование (но это много работы). Я бы предпочел хорошую статью или блог от того, кто уже потратил время, чтобы ответить на этот вопрос. - person David Parks; 15.02.2012
comment
Как я уже сказал, единственное доказательство, на которое вы должны полагаться, - это ваши собственные экспериментальные данные. - person Daniel Lyons; 15.02.2012