Вложенные транзакции

Автор Тема: Вложенные транзакции  (Прочитано 9229 раз)

0 Пользователей и 3 Гостей просматривают эту тему.

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 389
  • Карма: 21
Вложенные транзакции
« : 24-10-2021, 21:59:19 »
Всех приветствую. Как я понимаю, если открыть транзакцию, вызывать метод, в котором открывается и коммитится ещё одна транзакция и создаётся entity(линия/полилиния), то entity не появится на чертеже (например нельзя выделить её SelectCrossingPolygon()) пока верхняя транзакция не закоммитится?

Отмечено как Решение Lemieux 24-10-2021, 22:35:24

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вложенные транзакции
« Ответ #1 : 24-10-2021, 22:31:46 »
то entity не появится на чертеже
Появляется:

Код - C# [Выбрать]
  1. [CommandMethod("NestTrans")]
  2. public void MyCommand()
  3. {
  4.   Document doc = Application.DocumentManager.MdiActiveDocument;
  5.   if (doc == null) return;
  6.   Database db = doc.Database;
  7.   Editor ed = doc.Editor;
  8.   using (Transaction tr = doc.TransactionManager.StartTransaction())
  9.   {
  10.     using (Transaction trNest = doc.TransactionManager.StartTransaction())
  11.     {
  12.       BlockTableRecord btr =
  13.         trNest.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  14.       Circle cir = new Circle(Point3d.Origin, Vector3d.ZAxis, 10.0);
  15.       btr.AppendEntity(cir);
  16.       trNest.AddNewlyCreatedDBObject(cir, true);
  17.       trNest.Commit();
  18.       doc.TransactionManager.QueueForGraphicsFlush();
  19.       doc.TransactionManager.FlushGraphics();
  20.       ed.GetString("\nНажмите ENTER...");
  21.     }
  22.     tr.Commit();
  23.   }
  24. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 389
  • Карма: 21
Re: Вложенные транзакции
« Ответ #2 : 24-10-2021, 22:35:58 »
то entity не появится на чертеже
Появляется:

Код - C# [Выбрать]
  1. [CommandMethod("NestTrans")]
  2. public void MyCommand()
  3. {
  4.   Document doc = Application.DocumentManager.MdiActiveDocument;
  5.   if (doc == null) return;
  6.   Database db = doc.Database;
  7.   Editor ed = doc.Editor;
  8.   using (Transaction tr = doc.TransactionManager.StartTransaction())
  9.   {
  10.     using (Transaction trNest = doc.TransactionManager.StartTransaction())
  11.     {
  12.       BlockTableRecord btr =
  13.         trNest.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  14.       Circle cir = new Circle(Point3d.Origin, Vector3d.ZAxis, 10.0);
  15.       btr.AppendEntity(cir);
  16.       trNest.AddNewlyCreatedDBObject(cir, true);
  17.       trNest.Commit();
  18.       doc.TransactionManager.QueueForGraphicsFlush();
  19.       doc.TransactionManager.FlushGraphics();
  20.       ed.GetString("\nНажмите ENTER...");
  21.     }
  22.     tr.Commit();
  23.   }
  24. }
Круто! Спасибо!

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Вложенные транзакции
« Ответ #3 : 24-10-2021, 22:49:48 »
А как насчет отката транзакции? Есть красный объект А. Транзакция Б перекрашивает А в зеленый. Потом вложенная транзакция С перекрашивает А в синий и C.Commit().  Потом Б.Abort(). Цвет объекта А? синий или красный?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вложенные транзакции
« Ответ #4 : 24-10-2021, 22:52:25 »
синий или красный?
Должен быть красный. Не сложно проверить. ;)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вложенные транзакции
« Ответ #5 : 24-10-2021, 23:01:28 »
Код - C# [Выбрать]
  1. [CommandMethod("NestTrans1")]
  2. public void MyCommand1()
  3. {
  4.   Document doc = Application.DocumentManager.MdiActiveDocument;
  5.   if (doc == null) return;
  6.   Database db = doc.Database;
  7.   Editor ed = doc.Editor;
  8.   PromptEntityResult rs = ed.GetEntity("\nВыберите красный круг");
  9.   if (rs.Status != PromptStatus.OK) return;
  10.   using (Transaction tr = doc.TransactionManager.StartTransaction())
  11.   {
  12.     Entity en = tr.GetObject(rs.ObjectId, OpenMode.ForWrite) as Entity;
  13.     en.ColorIndex = 3;
  14.     using (Transaction trNest = doc.TransactionManager.StartTransaction())
  15.     {
  16.       Entity enNest = trNest.GetObject(rs.ObjectId, OpenMode.ForWrite) as Entity;
  17.       enNest.ColorIndex = 5;
  18.       trNest.Commit();
  19.       doc.TransactionManager.QueueForGraphicsFlush();
  20.       doc.TransactionManager.FlushGraphics();
  21.       ed.GetString("\nНажмите ENTER...");
  22.     }
  23.     tr.Abort();
  24.   }
  25. }

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение