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

ADN Club => AutoCAD .NET API => Тема начата: Алексей Терно от 09-08-2017, 15:54:23

Название: Транзакции быть или не быть?
Отправлено: Алексей Терно от 09-08-2017, 15:54:23
Коллеги, сейчас у нас есть несколько вариантов открытия объекта:

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

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

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

Судя по описанию, StartTransaction() следует использовать только тогда, когда четко контролируются все действия с объектом, а StartOpenCloseTransaction() можно использовать всегда и в любых случаях, т.е. второй вариант предпочтительнее. Учитывая последние новости про UpgradeOpen(), от метода StartTransaction() следует полностью отказаться.
А чем лучше открытие объекта напрямую - Open()? В описании он помечен, как "не рекомендуемый" и "устаревший". Не говорит ли это о том, что Автодеск может от этого метода отказаться в любой момент?
Название: Re: Транзакции быть или не быть?
Отправлено: Александр Ривилис от 09-08-2017, 17:39:53
Судя по описанию, StartTransaction() следует использовать только тогда, когда четко контролируются все действия с объектом, а StartOpenCloseTransaction() можно использовать всегда и в любых случаях, т.е. второй вариант предпочтительнее.
Скорее с точностью до наоборот. Т.е. OpenCloseTransaction требует от программиста повышенной внимательности. Нельзя открыть обобъект на запись если он уже открыт на чтение или запись, нельзя открыть объект более 255 раз и т.д.
А чем лучше открытие объекта напрямую - Open()? В описании он помечен, как "не рекомендуемый" и "устаревший".
Он не "устаревший", а "Advanced Only". Требует еще большей внимательности, чем OpenCloseTransaction - ни в коем случае нельзя забыть вызвать Dispose/Close для объекта открытого через Open (или использовать using).
Не говорит ли это о том, что Автодеск может от этого метода отказаться в любой момент?
Никогда. Это базовый метод. Без него ничего работать не будет.
Название: Re: Транзакции быть или не быть?
Отправлено: Алексей Терно от 11-08-2017, 11:16:44
Цитировать
Цитировать
Судя по описанию, StartTransaction() следует использовать только тогда, когда четко контролируются все действия с объектом, а StartOpenCloseTransaction() можно использовать всегда и в любых случаях, т.е. второй вариант предпочтительнее.
Скорее с точностью до наоборот. Т.е. OpenCloseTransaction требует от программиста повышенной внимательности. Нельзя открыть обобъект на запись если он уже открыт на чтение или запись, нельзя открыть объект более 255 раз и т.д.

Тем не менее, замена StartTransaction() на OpenCloseTransaction() неоднократно решала проблемы.
Название: Re: Транзакции быть или не быть?
Отправлено: Александр Ривилис от 11-08-2017, 11:33:23
Тем не менее, замена StartTransaction() на OpenCloseTransaction() неоднократно решала проблемы.
В некоторых контекстах обычная транзакция недопустима.
Название: Re: Транзакции быть или не быть?
Отправлено: Дмитрий Загорулькин от 11-08-2017, 12:30:13
В последнее время я использую транзакцию (Transaction) только в тестовых приложениях и демонстрационных примерах. В рабочем коде я от нее практически избавился. К сожалению, непредсказуемых проблем от нее больше, чем пользы. OpenCloseTransaction тоже практически полностью исключил. Мне гораздо спокойнее действовать по схеме: открыл->прочитал и сохранил нужные данные в переменных -> закрыл, либо открыл -> изменил -> закрыл. Да, конечно, кода получается больше. Но это небольшая цена за бОльшую стабильность работы приложения.
Название: Re: Транзакции быть или не быть?
Отправлено: Александр Ривилис от 11-08-2017, 14:38:53
Мне гораздо спокойнее действовать по схеме: открыл->прочитал и сохранил нужные данные в переменных -> закрыл, либо открыл -> изменил -> закрыл. Да, конечно, кода получается больше. Но это небольшая цена за бОльшую стабильность работы приложения.
Это для неленивых программистов. :)
Название: Re: Транзакции быть или не быть?
Отправлено: Дмитрий Загорулькин от 11-08-2017, 14:47:37
Мне просто лень потом искать, где прячется баг :)