Менеджер транзакции
Операционный менеджер - глобальный менеджер объект, подобный редактору, который отвечает за транзакции поддержания. Это - образец AcTransactionManager и поддержан в системном реестре системы. Вы можете получить это от системного реестра системы, используя макрокоманду actrTransactionManager, который расширяется до
#define actrTransactionManager \
AcTransactionManager::cast ( acrxSysRegistry()->at(AC_TRANSACTION_MANAGER_OBJ) )
Операционный менеджер должен использоваться, чтобы запустить, заканчивать, или прервать транзакции.
Это может также обеспечивать информацию типа числа активных транзакций в любой момент (см. следующую секцию, при Вложении транзакций ”) и список всех объектов, чей указатели были получены во всех транзакциях. Операционный менеджер поддерживает список реакторов, чтобы уведомить клиентов относительно событий типа начала, конца, или аварийного прекращения работы транзакции.
В дополнение к этим организаторским возможностям, операционный менеджер может также использоваться, чтобы получить указатели от объекта IDs. Когда это сделано, объект связан с высшей (самой современной) транзакцией. Операционный менеджер может также использоваться, чтобы стоять в очереди все объекты во всех транзакциях для графической модификации и сбрасывать на диск очередь.
Операционный менеджер объект создан и управляется системой. Вы не должны удалить это.
Вложение транзакций
Транзакции могут быть вложены — то есть Вы можете запустить одну транзакцию внутри другой и заканчивать или прерывать недавнюю транзакцию. Операционный менеджер поддерживает транзакции в стеке, с самой современной транзакцией наверху стека. Когда Вы запускаете новую транзакцию, используя AcTransactionManager:: startTransaction (), новая транзакция добавлена к вершине стека, и указатель на это возвращен (образец AcTransaction). Когда кто - то вызывает AcTransactionManager:: endTransaction () или AcTransactionManager:: abortTransaction (), транзакция наверху стека закончена или прервана.
Когда объектные указатели получены от объекта IDs, они всегда связываются с самой современной транзакцией. Вы можете получить недавнюю транзакцию, используя AcTransactionManager:: topTransaction (), затем использовать AcTransaction:: getObject () или AcTransactionManager:: getObject () чтобы получить указатель на объект. Операционный менеджер автоматически связывает объектные указатели, полученные с недавней транзакцией. Вы можете использовать AcTransaction:: getObject () только с самой современной транзакцией.
Когда вложенные транзакции начаты, объектные указатели, полученные во внешних содержащих транзакциях также доступны для операции в самой внутренней транзакции. Если недавняя транзакция прервана, все операции, сделанные на всех объектах (связанный или с этой транзакцией или содержащими) так как начало недавней транзакции отменено, и объекты прокручены назад к состоянию в начале недавней транзакции.
Объектные указатели, полученные в недавней транзакции прекращают иметь силу, как только это прервано.
Если самая внутренняя транзакция закончена успешно, вызывая AcTransactionManager:: endTransaction (), объекты, чей указатели были получены в этой транзакции, станут связанным с содержащей транзакцией и доступен для операции. Этот процесс продолжен, пока наиболее удаленная (первая) транзакция не закончена, в котором модификации времени на всех объектах совершены{*переданы*}. Если наиболее удаленная транзакция прервана, все операции на всех объектах отменены, и ничто не совершено{*передано*}.
Границы транзакции
Поскольку Вы, не система, отвечаете за старт, окончание, или транзакции прерывания выполнения, важно знать операционные границы. Операционная граница - время между началом и концом или аварийным прекращением работы транзакции.
Рекомендуется, чтобы Вы ограничили{*заключили*} вашу границу к самой маленькой возможной области{*контексту*}. Например, если Вы запускаете транзакцию в функции, пробуете заканчивать или прервать транзакцию прежде, чем Вы возвращаетесь от той функции, потому что Вы не можете иметь знание транзакции вне функции. Вы не должны следовать за этим правилом, если Вы поддерживаете некоторый глобального менеджера для ваших операционных действий, но Вы все еще ответствены за прерывание выполнения или окончание всех транзакций, которые Вы запускаете.
Множественные приложения могут использовать операционное управление для их работы, и операции на объектах совершены{*переданы*} в конце наиболее удаленной транзакции.
Поэтому, граница команды AutoCAD - то, насколько Вы можете протягивать границу ваших транзакций. Когда команда концы, там не должна быть никакие активные транзакции. Если имеются любые активные транзакции (операционный стек не пуст) когда команда концы, AutoCAD прервется. Как исключение, транзакции могут все еще быть активны, когда acedCommand () или прозрачная команда концы, но они должны весь быть решенными, когда основная команда концы и AutoCAD возвращается Приглашению ко вводу команды.
Это - вообще хорошая идея запустить транзакцию, когда одна из ваших функций вызвана как часть команды, зарегистрированной Вами и концом это, когда Вы возвращаетесь от той функции. Вы можете обобщать это к всем командам в AutoCAD, используя AcEditorReactor:: commandWillStart () и AcEditorReactor:: commandEnded () уведомления, но имеются некоторые команды, которые не должны быть проведены. Следующие команды не должны быть проведены:
§ ARX
§ DXFIN
§ INSERT
§ NEW
§ OPEN
§ PURGE
§ QUIT
§ RECOVER
§ REDO
§ SAVE
§ SCRIPT
§ U
§ UNDO
§ XREF
Получение указателей на объекты в транзакции
И AcTransactionManager:: getObject () и AcTransaction:: getObject () может использоваться, чтобы получить объектные указатели от объекта IDs. Указатели, таким образом полученные связаны с самой современной транзакцией. Попытка получить указатель, используя любых других операционных результатов по ошибке. Также, указатели, таким образом полученные имеют силу до транзакции они связаны с, или одна из содержащих транзакций, прерван. Когда наиболее удаленные операционные концы, изменения{*замены*} на всех имеющих силу указателях до того момента совершены{*переданы*}.
Оба из getObject () функции берут параметр типа AcDb:: OpenMode, и Вы можете получить объектный указатель для чтения, записывать, или уведомлять.
Все эти запросы преуспевают если бы не один случай: если объект уведомляет, и запрос должен получить указатель для записи (то есть с намерением изменения этого), ошибка (eWasNotifying) возвращена. Объект не должен измениться, в то время как это уведомляет другие относительно его состояния.
Если Вы используете getObject () функция, чтобы получить объектный указатель, Вы никогда не должны вызвать близко () на том объектном указателе. Запрос близко () имеет силу только, если Вы получили указатель, используя acdbOpenObject () или объект был недавно создан. Для подробной информации на том, когда Вы можете вызывать близко () на объектном указателе, см. следующие секции, “ Недавно Созданные Объекты и транзакции ” и “ Смешивание Модели Транзакции с Открытым и Близким Механизмом. ”
Недавно созданные объекты и транзакции
Имеются два способа иметь дело недавно с созданными объектами в операционном контексте управления.
Рекомендуемый подход состоит в том, чтобы закрыть () объект после добавления этого к базе данных или соответствующему контейнеру и сохранять ИДЕНТИФИКАТОР, который возвращен Вам. Право после закрытия объекта, который передает{*совершает*} это базе данных, Вы может использовать getObject () функция, чтобы получить новый указатель для ваших операций.
Даже если Вы вызываете близко () на объекте после добавления этого к базе данных, ее создание будет уничтожено, если содержащая транзакция прервана. См. “ Смешивание Модели Транзакции с Открытым и Близким Механизмом ” на странице 455.
Дополнительный подход состоит в том, чтобы добавить ваш недавно созданный, в оперативной памяти объект к базе данных или на соответствующий контейнер, который в свою очередь добавит это к базе данных.
Тогда добавьте это к самой современной транзакции, использующей AcTransactionManager::addNewlyCreatedDBRObject () или AcTransaction:: addNewlyCreatedDBRObject. Теперь, когда это связано с транзакцией, это будет совершено{*передано*} или несоздан в зависимости от того, заканчиваются ли транзакции успешно или аварийное прекращение работы.
Передавать-разовые руководящие принципы
Когда наиболее удаленные операционные концы, операционный менеджер обстреливает endCalledOnOutermostTransaction () уведомление (см. “ Реакторы Транзакции ” на странице 456) и начинает передающийся{*совершающийся*} процесс, в котором модификации на всех объектах, связанных с транзакцией совершены{*переданы*} базе данных.
Каждый объект совершен{*передан*} индивидуально, один за другим, пока все из них не совершены{*переданы*}. В течение этой операции, не измените никакой из объектов, вовлеченных в передающийся{*совершающийся*} процесс, и не запустите никакие новые транзакции. Если Вы делаете так, AutoCAD прервется с сообщением об ошибках eInProcessOfCommitting.
Вы можете изменять индивидуальные объекты после того, как каждый был совершен{*передан*}, но рекомендуется, чтобы Вы кэшировали ИДЕНТИФИКАТОРЫ объектов, которых Вы хотите изменять и ждать, пока Вы не получаете transactionEnded () уведомление, сигнализирующее конец всех транзакций, затем делайте модификации.
Отмена и транзакции
Операционные образцовые использования механизм отмены AutoCAD и AcDbObject:: отмена () в осуществлении AcTransactionManager:: abortTransaction (). Это требует, чтобы Вы не включили никакую операцию, которая использует механизм отмены команды подсистемы AutoCAD в транзакции. Это будет путать AcDbTransactionManager:: abortTransaction () и могло бы производить неожиданных результатов. Примеры операций, которые используют механизм отмены команды подсистемы - КОМАНДЫ SPLINEDIT и PEDIT.
Смешивание модели транзакции с открытым и близким механизмом
Операционная модель сосуществует с регулярным открытым и близким механизмом, описанным в главе 5, “ Объекты Базы данных. ” Однако, если Вы используете операционную модель, рекомендуется, чтобы Вы не смешали это с открытым и закрыли механизм. Например, если Вы получили указатель на объект, используя AcTransaction:: getObject (), Вы не должны вызвать близко () на объектном указателе, который мог вызывать неожиданных результатов и может разрушаться AutoCAD. Однако, Вы свободны открывать и закрыть специфический объект, даже если транзакции активны. Вы можете также инициализировать новые объекты, добавлять их к базе данных, и закрывать их, в то время как транзакции активны. Первичная цель наличия смешанной модели состоит в том, чтобы позволить одновременное выполнение множественных приложений, где некоторое управление транзакции использования и другие делают не, но все из них работают на тех же самых объектах.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |


