Добрый день!
В документации написано:
1. Блоки транзакций могут быть вложенными
2. Исключение автоматически прерывает текущую транзакцию
Исходя из этого я написал такой код:
PHP код:
CanPerform = false;
ttsbegin;
try {
ttsbegin;
select forupdate mt where mt.Name == 'ООО "Электролюкс"';
mt.Name = 'First updated record';
mt.update();
if (!CanPerform)
throw Exception::Error;
ttscommit;
}
catch (Exception::Error){
CanPerform = true;
}
select forupdate mt where mt.Name == 'ООО "Мирный атом"';
mt.Name = 'Second updated record';
mt.update();
ttscommit;
Писал исключительно для примера, поэтому логику прошу не обсуждать. Имел ввиду, что транзакция в try/catch откатится и управление перейдет в catch-блок, потом оставшиеся операторы нормально выполнятся и внешняя транзакция успешно завершится. Практика показала, что в базе не происходит НИКАКИХ изменений.
Может мне кто-нибудь объяснить ход выполнения программы? Почему изменения не проходят в базу? В модели MTS/Component services используется подход, очень похожий на аксаптовский, но там подобный код будет отрабатывать именно так, как я того ожидаю.