Транзакции в 1С 8.3(8.2) и СУБД
В рамках подготовки к сертификации 1С «Эксперт» в преддверии двух очень важных и глобальных тем — блокировок и взаимоблокировок хотелось бы разобрать то, без чего невозможны вышеназванные понятия, — транзакция СУБД.
Что такое транзакция
Транзакция — логически связанная, неделимая последовательность действий. Транзакция может быть либо выполнена целиком, либо вообще не выполнена. Для фиксации транзакции в СУБД используется метод COMMIT.
Типичный пример транзакции — перевод денежных средств с одного счета на другой:
- начать транзакцию;
- прочесть количество денежных средств на счету номер 123;
- уменьшить баланс счета 123 на 100 рублей;
- сохранить баланс счёта номер 123;
- прочесть количество денежных средств на счету номер 321;
- увеличить баланс на 100 рублей;
- записать новое количество денежных средств на счете 321;
- зафиксировать транзакцию.
Как мы видим, если транзакция выполнена не полностью, то она не имеет смысла.
Ключевые требования (ACID) к транзакционной СУБД
Одним из наиболее распространённых наборов требований к транзакциям и транзакционным СУБД является набор ACID (Atomicity, Consistency, Isolation, Durability). Это те свойства, которыми должна обладать любая транзакция:
- Атомарность (Atomicity) — никакая транзакция не должна быть зафиксирована частично;
- Согласованность (Consistency) — система находится в согласованном состоянии до начала транзакции и должна остаться в согласованном состоянии после завершения транзакции;
- Изолированность (Isolation) — во время выполнения транзакции параллельные транзакции не должны оказывать влияние на её результат;
- Надежность (Durability) — в случая сбоя изменения, сделанные успешно завершённой транзакцией, должны остаться сохранёнными после возвращения системы в работу.
Транзакции в 1С
Транзакции в 1С 8.3 и 8.2 создаются как автоматически, так и описываются разработчиками.
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
С помощью метода ТранзакцияАктивна() можно узнать, активна ли транзакция.
Пример автоматической транзакции — обработка проведения документа, запись элемента справочника в базу данных, запись набора записей регистра сведений и т.д.
Разработчик может и сам создать транзакцию. Для выполнения действий в транзакции необходимо в код активировать её:
НачатьТранзакцию();
По окончании транзакции её необходимо зафиксировать:
ЗафиксироватьТранзакцию();
Если Вы хотите отменить действия транзакции, необходимо выполнить метод:
ОтменитьТранзакцию();
1С не поддерживает вложенных транзакций. Поэтому, если Вы несколько раз открываете транзакцию, она «сливается» в одну. Если же Вы фиксируете или отменяете её, то это действие производится со всеми транзакциями, активируемыми ранее.
Если я не понятно расписал, рекомендую видеолекцию от коллег:
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
СПРОСИТЕ в комментариях!
1с транзакции:
Кстати не совсем верно, 1С 8 поддерживает вложенные транзакции. Однако это прозрачно для пользователя и не так прямо в языке выражено.
+ еще момент интересный: управляемые транзакции не всегда дают выигрыш по сравнению с автоматикой из-за оптимизации SQL запросов (к примеру на DB2).
Вася:
«1С 8 поддерживает вложенные транзакции». Нет и это явно описано в документации, а также подтверждается тестами и практикой.
«Однако это прозрачно для пользователя и не так прямо в языке выражено.» Что вы вообще этим хотели сказать?
Может вы вложенные транзакции путаете с конструкцией попытка — исключение? там вложенность поддерживается.
aksa:
1с8 поддерживает вложенные транзакции. ИТС — Технологические вопросы крупных внедрений — Стандарты разработки — Блокировки данных в 1С:Предприятии 8″.
Цитата «Внутри одной транзакции, которая начата и не завершена 1С:Предприятием, может быть начата еще одна (или несколько) транзакций. Такая логика работы обеспечивается платформой автоматически, а также поддерживается средствами встроенного языка.»
Treaq:
… только вот толку от начинания вложенной транзакции — ноль. Просто увеличивается внутренний счётчик транзакций, а сама транзакция всегда одна. Не совсем понятно зачем вообще сделано именно так, но имеем, что имеем.