Что значит getallobjects() в контексте вложенных транзакций?
Вопрос:Можете ли вы объяснить мне как работает метод getAllObjects() в контексте сценария использования вложенных транзакций? Я не нашел объяснения в ObjectARX Developer's Reference/Guide.
Ответ:
Давайте рассмотрим такой сценарий (это псевдокод, все транзакции типа AcDbTransaction)
-
T1
...
T1->getAllObjects();
T2
...
T2->getAllObjects();
T1->getAllObjects();
T3
...
T3->getAllObjects();
T2->getAllObjects();
T1->getAllObjects();
конец T3
T2->getAllObjects();
конец T2
T1->getAllObjects();
конец T1
-
МетодAcDbTransaction::getAllObjects() возвращает только те объекты, которые содержатся в списке объектов транзакции. Так что правильный вопрос – какие объекты находятся в списке объектов транзакции.
Если объект открыт в транзакции (или новый только что созданный объект добавлен к транзакции), он может быть открыт/добавлен только к текущей транзакции. Таким образом, в примере выше, в транзакции T1 будут объекты, которые открыты/добавлены до создания транзакции T2. В транзакции T2 будут объекты, которые были открыты/добавлены после начала транзакции T2, но перед началом транзакции T3. И в транзакции T3 будут только объекты, которые отрыты/добавлены после её начала..
Это всё справедливо пока никакие транзакции не закончились. Когда вложенная транзакция заканчивается все объекты этой транзакции перемещаются в следующую по уровню вложенности транзакцию. Таким образом, когда T3 закончится, все объекты станут частью списка объектов T2, а когда T2 закончится, все объекты станут частью списка объектов T1.
Таким образом в этом сценарии:
T1
...
T1->getAllObjects(); // только объекты T1
T2
...
T2->getAllObjects(); // только объекты T2
T1->getAllObjects(); // только объекты T1
T3
...
T3->getAllObjects(); // только объекты T3
T2->getAllObjects(); // только объекты T2
T1->getAllObjects(); // только объекты T1
конец T3
T2->getAllObjects(); // и объекты T2, и объекты T3
конец T2
T1->getAllObjects(); // объектыи T1, и T2 и T3
конец T1
Если вы используете метод AcTransactionManager::getAllObjects() , тогда вы получите все объекты всех транзакций, активных в момент вызова этого метода.
Обсуждение: http://adn-cis.org/forum/index.php?topic=803
Опубликовано 16.06.2014Отредактировано 17.06.2014 в 01:39:24