<?php
$application = \Bitrix\Main\Application::getInstance();
$connection = $application->getConnection();
try {
// Начинаем транзакцию
$connection->startTransaction();
// Получаем объект
$object = \Example\Table::query()
->where('CODE', 'example')
->addSelect('NAME')
->fetchObject();
if ($object) {
$object->set('NAME', 'Пример записи'); // Меняем поле `NAME` у объекта
$result = $object->save(); // Сохраняем
if (!$result->isSuccess()) {
thrownew \Bitrix\Main\SystemException('Ошибка в процессе сохранения данных.');
}
// Пробуем добавить элемент в другую таблицу
$anotherObject = \Example\AnotherTable::createObject();
$anotherObject->set('TITLE', 'New title');
$result = $anotherObject->save(); // Сохраняем
if (!$result->isSuccess()) {
// В случае ошибки откатываем транзакцию, первый элемент не сохраняется
thrownew \Bitrix\Main\SystemException('Ошибка в процессе сохранения данных.');
}
// Вложенная транзакция
$connection->startTransaction();
// Создаем объект для вложенной таблицы
$nestedObject = \Example\NestedTable::createObject();
$nestedObject->set('DESCRIPTION', 'Nested description');
$result = $nestedObject->save();
if (!$result->isSuccess()) {
// В случае ошибки откатываем вложенную транзакцию
// Т.к у битрикса действует парадигма "вложенные роллбеки не поддерживаются"
// Происходит исключение \Bitrix\Main\DB\TransactionException
$connection->rollbackTransaction();
}else {
// Успешно завершаем вложенную транзакцию
$connection->commitTransaction();
}
// Успешно завершаем основную транзакцию
$connection->commitTransaction();
}else {
thrownew \Bitrix\Main\SystemException('Объект не найден.');
}
}catch (\Bitrix\Main\DB\TransactionException $e) {
// ROLLBACK вложенной транзакции
// Тут мы можем решить, что делать, если вложенная транзакция не прошла
}catch (\Throwable $e) {
// Если произошла ошибка, отменяем транзакцию
$connection->rollbackTransaction();
throw $e;
}