Сообщество программистов Autodesk в СНГ
ADN Club => AutoCAD .NET API => Тема начата: exilerus от 07-05-2018, 10:33:47
-
Здравствуйте, коллеги.
Возник вопрос, опишу ситуацию.
Есть чертеж, на котором находятся блокреференсы. Есть приложение, которое оценивает блоки по их атрибутам и вносит в таблицу приложения ( я "подписался" на события базы данных, при каждом изменении, добавлении или удалении происходит сканирование чертежа). Сканирование происходит, используя транзакцию.
Проблема в том, что когда я использую другое свое приложение для того, чтобы поместить блок на чертеж, я тоже открываю транзакцию, в этот момент срабатывает событие и я получаю ошибку из-за двух транзакций одновременно.
Подскажите, пожалуйста, что можно с этим сделать. Может быть можно просмотреть все блоки и их атрибуты без использования транзакции?
Заранее спасибо!
-
Может быть можно просмотреть все блоки и их атрибуты без использования транзакции?
Можно. Два варианта:
1. Эмуляция транзакции: TransactionManager.StartOpenCloseTransaction
Пример: http://adn-cis.org/sozdanie-polyline3d-bez-ispolzovaniya-tranzakczii.html
2. ObjectId.Open/Close
Пример: http://adn-cis.org/kak-poluchit-neispolzuemyie-vneshnie-ssyilki-rastryi-i-podlozhki.html
-
я "подписался" на события базы данных, при каждом изменении, добавлении или удалении происходит сканирование чертежа
Какая жуть.
-
Спасибо за ответ!
Про "жуть" - это попытка посмотреть на реалтайм.
Есть другие варианты?
-
Странная ошибка. Разве нельзя держать сколько угодно открытых транзакций? Проблема должна возникать, только если несколько раз будет открыт на запись один и тот же объект. Нет? К тому же по идее событие изменения объекта будет в момент закрытия транзакции, его редактировавшей - т.е. сначала одна транзакция закрывается, потом открывается другая.
-
Странная ошибка.
Достаточно часто в событиях базы вообще нельзя использовать транзакции.
-
Есть другие варианты?
Да. Не сканировать базу.
-
Да, Александр прав. Вся ошибка зависит от событий базы.
Не так смертельно будет этого не иметь, но хочется видеть изменения в реальном времени, вот и пробую.
-
Разве нельзя держать сколько угодно открытых транзакций?
Можно, конечно.
Проблема должна возникать, только если несколько раз будет открыт на запись один и тот же объект.
Вроде бы, транзакции прощают даже такое.
К тому же по идее событие изменения объекта будет в момент закрытия транзакции, его редактировавшей
Насколько я понимаю - нет. Событие изменения возникает в момент изменения. А при закрытии транзакции происходит закрытие объекта.
-
Цитата: avc от 07-05-2018, 10:53:58
К тому же по идее событие изменения объекта будет в момент закрытия транзакции, его редактировавшей
Насколько я понимаю - нет. Событие изменения возникает в момент изменения. А при закрытии транзакции происходит закрытие объекта.
Да. Если подразумевать под закрытием транзакции Commit. Происходит не просто закрытие объекта, а подтверждение изменений. Если нет Commit, то вместо закрытия объекта (Close), происходит отказ от изменений (Abort) и объект восстанавливается к состоянию до его открытия.
-
я "подписался" на события базы данных, при каждом изменении, добавлении или удалении происходит сканирование чертежа
А зачем сканировать все? Почему не смотреть только те объекты, которые "изменились, добавились, удалились"?
Еще есть вариант - следить за изменением состояния блокировки документа. Она вроде как тесно связана с транзакцией. Но это тёмный лес в который опасно ходить и о котором мало написано