Должны ли веб-приложения использовать явные транзакции SQL?

#sql #web-applications #transactions

Вопрос:

Рассмотрим обычное веб-приложение, выполняющее в основном операции CRUD на основе форм над базой данных SQL. Должно ли в таком веб-приложении быть явное управление транзакциями? Или он должен просто использовать режим автоматической фиксации? И если выполнять транзакции, достаточно ли «транзакции по запросу»?

Комментарии:

1. Вам следует более четко указать, какие СУБД вы используете.

Ответ №1:

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

Мы используем транзакции на SO, но очень редко. Большинство обновлений нашей базы данных являются автономными и атомарными. Очень немногие обладают свойствами приведенного выше банковского примера.

Ответ №2:

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

Комментарии:

1. Вам нужно немного больше объясняться, когда вы делаете подобные заявления.

Ответ №3:

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

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

Существуют исключения из этого правила, когда транзакция инициируется веб-приложением, но их, как правило, немного и они находятся далеко друг от друга.

Ответ №4:

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

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

Комментарии:

1. Не могли бы вы указать какие-либо причины, по которым следует использовать транзакции и не использовать автоматическую фиксацию? И нет никакой «единицы работы», кроме обработки запроса POST HTTP, данных проверки и хранения их в базе данных с помощью одной ВСТАВКИ или ОБНОВЛЕНИЯ.

2. Если это ДЕЙСТВИТЕЛЬНО одна ВСТАВКА или ОБНОВЛЕНИЕ, то вы используете неявные транзакции. Но использование явных транзакций-хорошая привычка (по вышеуказанным причинам), поскольку вы не знаете, как продукт будет развиваться в будущем.

Ответ №5:

Это зависит от того, как выполняется обработка CRUD, если и только если все создания и модификации экземпляров модели выполняются в одном запросе на обновление или вставку, вы можете использовать автоматическую фиксацию.

Если вы имеете дело с CRUD в режиме нескольких запросов (плохая идея, IMO), вам, безусловно, следует явно определить транзакции, поскольку эти запросы, безусловно, будут «транзакционно связаны», вы не захотите заканчивать с половиной модели в вашей базе данных. Это актуально, потому что некоторые веб-фреймворки, как правило, по разным причинам выполняют «несколько запросов».

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

Комментарии:

1. Что вы подразумеваете под «сделано за один запрос»? В SQL Server в режиме автоматической фиксации каждая инструкция обрабатывается индивидуально. См.: msdn.microsoft.com/en-us/library/ms187878.aspx

2. Я имею в виду заявление. Под «сделано в одном запросе» я подразумеваю, что создание/модификация модели выполняются в одном запросе на обновление/вставку, в отличие от обновления каждой части модели в отдельном запросе, как это делают некоторые фреймворки.

3. Это положение подразумевает, что режим автоматической фиксации в порядке, если приложение отправляет пакет, а не отдельные инструкции. Это неверно. В режиме автоматической фиксации каждая инструкция в пакете выполняется индивидуально. В пакете {StatementA}; {StatementB}; B мог произойти сбой, но A уже был зафиксирован.

Ответ №6:

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