Следующий пример включает три вложенных транзакции. Последовательность событий следует.
Создавать вложенные транзакции
1 Создают многоугольник и переносят это к базе данных.
2 Транзакция Начала 1:
3 Транзакция Начала 2: Вычтите цилиндр от вытеснения (создает отверстие в середине твердых).
4 Транзакция Начала 3:
5 Транзакции Начала 3 (снова): Сектор форма в половине по Y/Z плану и перемещению это по Y.
6 Конечных Транзакции 3.
7 Конечных Транзакции 2.
ОБРАТИТЕ ВНИМАНИЕ, прерываетесь ли Вы в этой точке, транзакции 2 и 3 оба отменены. Если Вы прерываете содержащую транзакцию, все вложенные транзакции прерваны, даже если они были успешно закончены.
8 Конечных Транзакции 1.
Следующее - код для этого примера:
void
transactCommand()
{
Adesk::Boolean interrupted;
Acad::ErrorStatus es = Acad::eOk;
AcDbObjectId savedCylinderId,savedExtrusionId;
// Create a poly and post it to the database.
//
acutPrintf("\nCreating a poly...Please supply the"
" required input.");
if ((es = createAndPostPoly()) != Acad::eOk)
return;
// Start a transaction.
//
AcTransaction *pTrans = actrTransactionManager->startTransaction();
assert(pTrans != NULL);
acutPrintf("\n\n###### Started transaction one." " ######\n");
// Select the poly and extrude it.
//
AcDbObject *pObj = NULL;
AsdkPoly *pPoly = NULL;
AcDb3dSolid *pSolid = NULL;
AcDbObjectId objId;
ads_name ename;
ads_point pickpt;
for (;;) {
switch (acedEntSel("\nSelect a polygon: ", ename, pickpt))
{
case RTNORM:
acdbGetObjectId(objId, ename);
if ((es = pTrans->getObject(pObj, objId, AcDb::kForRead)) != Acad::eOk)