передавать список безопасных ObjectId, а не опасные DBObjectто ясно, что метод, куда передаем идентификаторы, должен открывать собственную транзакцию (то есть к этому времени все открытые транзакции были закрыты). Или нет? Можно же методу и открытыю транзакцию передать, вместе с ObjectId? Насколько тогда будет "опасной" такая техника?
теперь передаю МОЮ транзакцию во все методыДа, я тоже почти всегда так делаю. В том числе и поэтому возник вопрос, который я задаю в теме - правильно ли таскать одну транзакцию из метода в метод, или лучше открывать в каждом методе свою для небольшой порции операций. И вообще - сколько операций может "вместить" одна транзакция. Я так понимаю, четкого ответа нет, каждый делает, как умеет...
Комит транзакции похоже вообще ничего не делаетВот с этим не согласен, есть у меня одна прога, которая рекурсивно по блокам проходится кое что меняет и другие действия, на чертеже в 60 метров она пыхтела минут 10-20, причем на коммит уходило до полутора минут.
Вопрос такой: какова лучшая практика в использовании транзакции - сколько операций рекомендуется проводить в рамках одной транзакции, как лучше поступать - все запихивать в одну транзакцию, или последовательно открывать/закрывать несколько транзакций, в рамках каждой из них выполняя однотипные операции.
Не всегда возможно обойтись одной транзакцией. Редко, бывают случае когда нужно добавить сложный объект, например блок, таблицу, стиль и т.д. и закрыть транзакцию, чтобы объект появился в чертеже. Затем снова открыть транзакцию и произвести действия, что-то добавить, изменить. Иначе будут ошибки и вылеты в какой-нибудь версии автокада. Это нигде не описано.Чтобы объект появлялся на чертеже транзакцию необязательно закрывать.
Чтобы объект появлялся на чертеже транзакцию необязательно закрывать.Я как раз о том же писал, что Commit ничего не делает, все изменения применяются ко всей БД сразу же, до Commit и видны из всех остальных транзакций и иногда видны даже пользователем (что полностью не соответствует понятию транзакция в реляционных базах данных). Никакой изоляции. Просто удобный способ замены using... ну еще откат полезен бывает, да...
Я как раз о том же писал, что Commit ничего не делает,Commit равносилен выполнению операции Close для всех объектов, участвующих в транзакции. Поэтому сказать, что он ничего не делает - неправильно.
Commit равносилен выполнению операции Close для всех объектовА что фактически делает операция Close ? Какие-то манипуляции с неуправляемой памятью? Все свойства всех объектов чертежа уже реально применены ДО закрытия транзакции.
Какие-то манипуляции с неуправляемой памятью?Ну в принципе да. И кроме того срабатывают реакции AutoCAD на закрытие/изменения объектов.
Lemieux,Так Вы сами давно подсказали как работать с объектами, созданными во время транзакции.
Поясни свою мысль.
как вариант если кад 2025Тестирую на AutoCAD 2020
это уже считай за пределами выложенного куска, так что тут немного не понятно, что же там дальшеЕсли закомментировать все, что дальше идёт, все равно вылетает, т.е. я, видимо, как-то неправильно обращаюсь в этом фрагменте или с файлами, или с памятью. При отладке получаю сообщение, что acdbmgd.dll пытается записать информацию в секцию, защищённую от записи. Т.е. у меня есть подозрение, что я после всего держу какой-то фрагмент занятым, и при попытке его освобождения и происходит падение.
Если закомментировать все, что дальше идёт, все равно вылетает, т.е. я, видимо, как-то неправильно обращаюсь в этом фрагменте или с файлами, или с памятью. При отладке получаю сообщение, что acdbmgd.dll пытается записать информацию в секцию, защищённую от записи. Т.е. у меня есть подозрение, что я после всего держу какой-то фрагмент занятым, и при попытке его освобождения и происходит падение.
попробовать закомментировать строку dbCurrent.CloseInput(true); всегда работаю без нее и ни разу таких проблем не встречалЕсть одна древняя статья, где чел очень убедительно описывает, зачем нужно использовать CloseInput(). Вот ссылка на статью: https://adndevblog.typepad.com/autocad/2012/07/using-readdwgfile-with-net-attachxref-or-objectarx-acdbattachxref.html