ADN Open CIS
Сообщество программистов Autodesk в СНГ

16/06/2014

Что значит 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://adndevblog.typepad.com/autocad/2012/08/whats-the-meaning-of-getallobjects-in-the-context-of-nested-transactions.html

 

Обсуждение: http://adn-cis.org/forum/index.php?topic=803

Опубликовано 16.06.2014
Отредактировано 17.06.2014 в 01:39:24