Подтвердить что ты не робот

Передовая практика транзакций

Сколько вы полагаетесь на транзакции базы данных?

Вы предпочитаете небольшие или крупные транзакции?

Вы предпочитаете обработку транзакций на стороне клиента (например, TransactionScope в .NET) по серверу или наоборот?

Как насчет вложенных транзакций?

Есть ли у вас несколько советов и трюков, связанных с транзакциями?

Любые проблемы, с которыми вы столкнулись, работая с транзакцией?

Приветствуем все ответы.

4b9b3361

Ответ 1

Я всегда переношу транзакцию в оператор using.

using(IDbTransaction transaction )
{
// logic goes here.
   transaction.Commit();
}

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

В моем коде я фактически опускаю явные откаты и полагаюсь на оператор using, чтобы выполнить эту работу для меня. Я только явно выполняю коммиты.

Я нашел, что этот шаблон резко сократил проблемы с блокировкой записи.

Ответ 2

Лично, создавая веб-сайт, основанный на высокой производительности трафика, я всегда избегаю транзакций базы данных. Очевидно, что они необходимы, поэтому я использую переменные объекта ORM и уровня страницы, чтобы минимизировать количество вызовов на стороне сервера, которые я должен выполнить.

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

Ответ 3

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

Я предпочитаю обработку транзакций на клиентской стороне, где это возможно. Если вы отнесены к выполнению sps или других логических единиц работы на стороне сервера, транзакции на стороне сервера прекрасны.

Ответ 4

Ничего себе! Много вопросов!

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

Кроме того, мне нравится управлять транзакциями декларативно с помощью аннотаций (я парень Java) и аспектов. Это очень чистый способ определения границ транзакций и включает в себя функции распространения транзакций.

Ответ 5

Так же, как FYI... Вложенные транзакции могут быть опасными. Это просто увеличивает шансы получить тупик. Поэтому, хотя это хорошо и необходимо, способ, которым он реализован, важен в ситуации с большим объемом.

Ответ 6

Операции на стороне сервера, 35 000 транзакций в секунду, SQL Server: 10 уроков из 35 тыс. тс

Мы используем только транзакции на стороне сервера:

  • может начать позже и закончить раньше
  • не распространяется
  • может выполнять работу до и после
  • SET XACT_ABORT ON означает немедленный откат при ошибке
  • клиент/OS/драйвер агностик

Другое:

  • мы вставляем вызовы, но используем @@TRANCOUNT для обнаружения уже запущенных TXN
  • каждый вызов БД всегда является атомарным

Мы имеем дело с миллионами строк INSERT в день (некоторые из них размещаются через промежуточные таблицы), полный OLTP, без проблем. Не 35k tps, хотя.

Ответ 8

Как сказала Сара Чиппс, транзакция является чрезмерной для приложений с высоким трафиком. Поэтому мы должны избегать его как можно больше. Другими словами, мы используем BASE-архитектуру, а не ACID. Ebay - типичный случай. Распределенная транзакция вообще не используется в архитектуре Ebay. Но для возможная согласованность, вам нужно сделать какой-то трюк самостоятельно.