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

ADN Club => Inventor API => Тема начата: filat от 15-12-2020, 11:41:29

Название: Безопасное использование транзакций
Отправлено: filat от 15-12-2020, 11:41:29
Принцип использование транзакций понятен: начало-конец, все просто в идеале.
Но меня опять понесло не-туда  - как защититься от сбоев кода, не получилось завершить транзакцию!? Что делать???
Когда простой код операции - то все нормально и никаких проблем.
Но вот я столкнулся с тем, что под одну транзакцию попадает достаточно объемный код, редактирующий большую сборку. И не всегда легко отловить место возникновения ошибке в коде... В результате чего появляется не завершенная транзакция!!! и при продолжении работы начинают вылазисть ошибки и нестыковки связанные с незавершенной транзакцией, что в свою очередь, приводит к невозможности сохранить результаты работы над сборкой...
Есть ли универсальные методы отслеживания а качественной финализации/отмены не завершенных транзакций?
Название: Re: Безопасное использование транзакций
Отправлено: Lemieux от 15-12-2020, 11:50:19
А вот такая конструкция не подойдёт?
Код - C# [Выбрать]
  1. using (Transaction tr = db.TransactionManager.StartTransaction())
  2. {
  3.   try
  4.   {
  5.     tr.Commit();
  6.   }
  7.   catch (System.Exception)
  8.   {
  9.     tr.Abort();
  10.   }
  11. }
Название: Re: Безопасное использование транзакций
Отправлено: filat от 15-12-2020, 12:09:16
Можете добавить пояснений? Мне в VB доступен Abort, но вот Commit - нет!? что это такое и с чем его едят?
Название: Re: Безопасное использование транзакций
Отправлено: Lemieux от 15-12-2020, 12:26:20
Можете добавить пояснений? Мне в VB доступен Abort, но вот Commit - нет!? что это такое и с чем его едят?
В Inventor должен быть метод End(). Это был пример из AutoCAD, я думал общая суть будет ясна - если всё хорошо, то закрываем транзакцию, если ошибка, то отменяем изменения.
Название: Re: Безопасное использование транзакций
Отправлено: filat от 15-12-2020, 12:56:20
End у меня и есть End.
Теперь уже два вопроса: для подключения к не завершенной транзакции достаточно обращения:
Код - vb.net [Выбрать]
  1. GTNFrame = m_inventorApplication.TransactionManager.StartGlobalTransaction()
И второй - что такое Commit?
Название: Re: Безопасное использование транзакций
Отправлено: Александр Ривилис от 15-12-2020, 13:08:22
И второй - что такое Commit?
Commit в AutoCAD - это End в Inventor.
Название: Re: Безопасное использование транзакций
Отправлено: filat от 15-12-2020, 13:16:44
Commit в AutoCAD - это End в Inventor.
Теперь понятнее. И тут еще более необходимым становиться ответ на первый вопрос? - уж очень не хочется его искать опытным путем... :'(
Название: Re: Безопасное использование транзакций
Отправлено: Александр Ривилис от 15-12-2020, 13:19:05
Теперь уже два вопроса: для подключения к не завершенной транзакции достаточно обращения:
Вообще-то "незавершенная транзакция" - это TransactionManager.CurrentTransaction
Название: Re: Безопасное использование транзакций
Отправлено: filat от 15-12-2020, 16:11:40
Какое состояние для CurrentTransaction говорит о наличии незавершенности? для него подходит обращение Abort?
Название: Re: Безопасное использование транзакций
Отправлено: Александр Ривилис от 15-12-2020, 16:24:51
Незавершенная транзакция - это если её State == kUncommittedState
Название: Re: Безопасное использование транзакций
Отправлено: mikazakov от 18-12-2020, 08:21:27
Какое состояние для CurrentTransaction говорит о наличии незавершенности? для него подходит обращение Abort?
Ну судя по хэлпу : CurrentTransaction.State
и состояние может быть
kDoneState   36866   Done/committed state.
kUncommittedState  36865   Uncommitted state.
kUndoneState   36867  Undone state.

Может тебе события нужны? Тогда тебе в TransactionManager.TransactionEvents
там пять событий:
OnAbort      The OnAbort event notifies the client when a transaction has been aborted.
OnCommit     The OnCommit event notifies the client when a transaction has been committed.
OnDelete     The OnDelete event notifies the client when a transaction has been deleted from the transaction stack.
OnRedo     The OnRedo event notifies the client when a redo operation is being performed.
OnUndo     The OnUndo event notifies a client when an undo operation is being performed.