Транзакции СУБД

Для начала давайте определимся в целом с тем, какие операции мы можем выполнять. Например, мы можем изменить сумму заказа покупателя – это одна операция. Но мы так же можем не просто изменить сумму заказа, но и изменить и сумму счета, с которым связан заказ.

При этом не должно возникать такой ситуации, что сумма заказа изменилась, а сумма счета нет.

Например, мы изменили сумму в заказе, а потом произошел технический сбой (выключили электричество), т.е. сумма заказа изменилась, а сумму счета мы просто не успели изменить. Такого рода изменения не должны быть записаны в СУБД, потому что для нас оба действия: изменение суммы заказа и изменение суммы счета – это одна неделимая операция.

Такие последовательные действия, которые могут либо быть полностью выполнены, либо полностью не выполнены, называются транзакцией.

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

Курс 1С: Эксперт. Знакомство с транзакциями СУБД
Знакомство с транзакциями СУБД

Очевидно, что у транзакции есть свое начало и свой окончание. Для того чтобы начать транзакцию, необходимо выполнить команду BEGIN, а чтобы зафиксировать, используется команда COMMIT. Для принудительной отмены, например, мы уже сделали какие-то действия и поняли, что дальше мы продолжать не можем, используется команда ROLLBACK.

Механизм WAL в СУБД

Для выполнения операций над данными используется механизм WAL (Write Ahead Log), который реализует запись всех действий сначала в журнал логов (файл ldf для MS SQL). И только потом СУБД переносит всю информацию в сами таблицы СУБД (файл mdf для MS SQL).

Таким образом, по журналу логов можно получить данные на конкретную временную точку (срез).

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

Транзакции в 1С: Предприятие

Среда разработки 1С: Предприятие автоматически запускает и фиксирует/отменяет транзакции при любом нашем действии над объектами. Но если мы хотим обернуть в транзакцию действия над несколькими объектами, т.е. сделать действия над несколькими объектами одной логической единицей, то мы используем команды 1С: НачатьТранзакцию(), ЗафиксироватьТранзакцию(), ОтменитьТранзакцию().

Чтобы проверить, активна ли транзакция в данный момент (открыта ли уже транзакция в 1С), то мы можем выполнить команду ТранзакцияАктивна(), которая нам вернет ИСТИНА/ЛОЖЬ .

Транзакция открывается автоматически при записи любого объекта 1С!

Вложенность не поддерживается. Другими словами, если транзакция уже активна, а вы вызовите команду НачатьТранзакцию(), то 1С: Предприятие ее просто проигнорирует. А если вы напишите НачатьТранзакцию() 5 раз, и потом 1 раз ЗафиксироватьТранзакци() или ОтменитьТранзакцию, то она полностью зафиксируется/отменится.

При повторном вызове команды зафиксировать или отменить, будет ошибка: «Транзакция не активна».

Данная тема подробнее рассматривается в пакете видео-курса «Секреты 1С: Эксперта» Шаг 3. Занятие 09-01 Знакомство с блокировками СУБД.
Константин Ефимов | 1С: Эксперт. Фриланс, Бали

КОНСТАНТИН ЕФИМОВ
Комментарии и вопросы