Транзакции быть или не быть?

Автор Тема: Транзакции быть или не быть?  (Прочитано 6036 раз)

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

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Коллеги, сейчас у нас есть несколько вариантов открытия объекта:

через транзакцию:
Код - C# [Выбрать]
  1. TransactionManager.StartTransaction()

через другую транзакцию:
Код - C# [Выбрать]
  1. TransactionManager.StartOpenCloseTransaction()

напрямую:
Код - C# [Выбрать]
  1. entid.Open(OpenMode.ForWrite)

Судя по описанию, StartTransaction() следует использовать только тогда, когда четко контролируются все действия с объектом, а StartOpenCloseTransaction() можно использовать всегда и в любых случаях, т.е. второй вариант предпочтительнее. Учитывая последние новости про UpgradeOpen(), от метода StartTransaction() следует полностью отказаться.
А чем лучше открытие объекта напрямую - Open()? В описании он помечен, как "не рекомендуемый" и "устаревший". Не говорит ли это о том, что Автодеск может от этого метода отказаться в любой момент?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Транзакции быть или не быть?
« Ответ #1 : 09-08-2017, 17:39:53 »
Судя по описанию, StartTransaction() следует использовать только тогда, когда четко контролируются все действия с объектом, а StartOpenCloseTransaction() можно использовать всегда и в любых случаях, т.е. второй вариант предпочтительнее.
Скорее с точностью до наоборот. Т.е. OpenCloseTransaction требует от программиста повышенной внимательности. Нельзя открыть обобъект на запись если он уже открыт на чтение или запись, нельзя открыть объект более 255 раз и т.д.
А чем лучше открытие объекта напрямую - Open()? В описании он помечен, как "не рекомендуемый" и "устаревший".
Он не "устаревший", а "Advanced Only". Требует еще большей внимательности, чем OpenCloseTransaction - ни в коем случае нельзя забыть вызвать Dispose/Close для объекта открытого через Open (или использовать using).
Не говорит ли это о том, что Автодеск может от этого метода отказаться в любой момент?
Никогда. Это базовый метод. Без него ничего работать не будет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Транзакции быть или не быть?
« Ответ #2 : 11-08-2017, 11:16:44 »
Цитировать
Цитировать
Судя по описанию, StartTransaction() следует использовать только тогда, когда четко контролируются все действия с объектом, а StartOpenCloseTransaction() можно использовать всегда и в любых случаях, т.е. второй вариант предпочтительнее.
Скорее с точностью до наоборот. Т.е. OpenCloseTransaction требует от программиста повышенной внимательности. Нельзя открыть обобъект на запись если он уже открыт на чтение или запись, нельзя открыть объект более 255 раз и т.д.

Тем не менее, замена StartTransaction() на OpenCloseTransaction() неоднократно решала проблемы.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Транзакции быть или не быть?
« Ответ #3 : 11-08-2017, 11:33:23 »
Тем не менее, замена StartTransaction() на OpenCloseTransaction() неоднократно решала проблемы.
В некоторых контекстах обычная транзакция недопустима.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Транзакции быть или не быть?
« Ответ #4 : 11-08-2017, 12:30:13 »
В последнее время я использую транзакцию (Transaction) только в тестовых приложениях и демонстрационных примерах. В рабочем коде я от нее практически избавился. К сожалению, непредсказуемых проблем от нее больше, чем пользы. OpenCloseTransaction тоже практически полностью исключил. Мне гораздо спокойнее действовать по схеме: открыл->прочитал и сохранил нужные данные в переменных -> закрыл, либо открыл -> изменил -> закрыл. Да, конечно, кода получается больше. Но это небольшая цена за бОльшую стабильность работы приложения.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Транзакции быть или не быть?
« Ответ #5 : 11-08-2017, 14:38:53 »
Мне гораздо спокойнее действовать по схеме: открыл->прочитал и сохранил нужные данные в переменных -> закрыл, либо открыл -> изменил -> закрыл. Да, конечно, кода получается больше. Но это небольшая цена за бОльшую стабильность работы приложения.
Это для неленивых программистов. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Транзакции быть или не быть?
« Ответ #6 : 11-08-2017, 14:47:37 »
Мне просто лень потом искать, где прячется баг :)