Безопасное использование транзакций

Автор Тема: Безопасное использование транзакций  (Прочитано 2164 раз)

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

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

  • ADN Club
  • ****
  • Сообщений: 262
  • Карма: 2
Принцип использование транзакций понятен: начало-конец, все просто в идеале.
Но меня опять понесло не-туда  - как защититься от сбоев кода, не получилось завершить транзакцию!? Что делать???
Когда простой код операции - то все нормально и никаких проблем.
Но вот я столкнулся с тем, что под одну транзакцию попадает достаточно объемный код, редактирующий большую сборку. И не всегда легко отловить место возникновения ошибке в коде... В результате чего появляется не завершенная транзакция!!! и при продолжении работы начинают вылазисть ошибки и нестыковки связанные с незавершенной транзакцией, что в свою очередь, приводит к невозможности сохранить результаты работы над сборкой...
Есть ли универсальные методы отслеживания а качественной финализации/отмены не завершенных транзакций?

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 382
  • Карма: 21
А вот такая конструкция не подойдёт?
Код - 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. }

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

  • ADN Club
  • ****
  • Сообщений: 262
  • Карма: 2
Можете добавить пояснений? Мне в VB доступен Abort, но вот Commit - нет!? что это такое и с чем его едят?

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 382
  • Карма: 21
Можете добавить пояснений? Мне в VB доступен Abort, но вот Commit - нет!? что это такое и с чем его едят?
В Inventor должен быть метод End(). Это был пример из AutoCAD, я думал общая суть будет ясна - если всё хорошо, то закрываем транзакцию, если ошибка, то отменяем изменения.

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

  • ADN Club
  • ****
  • Сообщений: 262
  • Карма: 2
End у меня и есть End.
Теперь уже два вопроса: для подключения к не завершенной транзакции достаточно обращения:
Код - vb.net [Выбрать]
  1. GTNFrame = m_inventorApplication.TransactionManager.StartGlobalTransaction()
И второй - что такое Commit?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
И второй - что такое Commit?
Commit в AutoCAD - это End в Inventor.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 262
  • Карма: 2
Commit в AutoCAD - это End в Inventor.
Теперь понятнее. И тут еще более необходимым становиться ответ на первый вопрос? - уж очень не хочется его искать опытным путем... :'(

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Теперь уже два вопроса: для подключения к не завершенной транзакции достаточно обращения:
Вообще-то "незавершенная транзакция" - это TransactionManager.CurrentTransaction
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 262
  • Карма: 2
Какое состояние для CurrentTransaction говорит о наличии незавершенности? для него подходит обращение Abort?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Незавершенная транзакция - это если её State == kUncommittedState
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Какое состояние для 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.