Каковы проблемы использования транзакций в базе данных?

StackOverflow https://stackoverflow.com/questions/60518

  •  09-06-2019
  •  | 
  •  

Вопрос

От эта почта.Одной из очевидных проблем является масштабируемость/производительность.Какие еще проблемы вызовет использование транзакций?

Можете ли вы сказать, что существует два набора проблем: один для длительных транзакций, другой для коротких?Если да, то как бы вы их определили?

РЕДАКТИРОВАТЬ:Взаимная блокировка — еще одна проблема, но несогласованность данных может быть еще хуже, в зависимости от домена приложения.Если предположить, что домен, пригодный для транзакций (банковское дело, если использовать канонический пример), возможность тупиковой ситуации больше похожа на затраты, которые приходится платить за обеспечение согласованности данных, а не на проблему с использованием транзакций, или вы не согласны?Если да, то какие еще решения вы бы использовали для обеспечения согласованности данных без взаимоблокировок?

Это было полезно?

Решение

Это во многом зависит от реализации транзакций внутри вашей базы данных, а также может зависеть от используемого вами уровня изоляции транзакций.Я предполагаю здесь «повторяемое чтение» или выше.Удержание транзакций открытыми в течение длительного времени (даже тех, которые ничего не изменили) заставляет базу данных удерживать удаленные или обновленные строки часто меняющихся таблиц (на всякий случай, если вы решите их прочитать), которые в противном случае могли бы быть выброшены.

Кроме того, откат транзакций может оказаться очень дорогостоящим.Я знаю, что в движке MySQL InnoDB откат большой транзакции может занять НАМНОГО больше времени, чем ее фиксация (мы видели, что откат занимает 30 минут).

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

Другие советы

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

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

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

-Адам

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

Например, я мог бы:

  • Создание транзакций внутри хранимых процедур,
  • Используйте API доступа к данным (ADO.NET) для управления транзакциями.
  • Используйте некоторую форму неявного отката выше в приложении.
  • Распределенная транзакция (через DTC/COM+).

Использование более одного из этих уровней в одном приложении часто создает проблемы с производительностью и/или целостностью данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top