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

ADN Club => AutoCAD .NET API => Тема начата: exilerus от 07-05-2018, 10:33:47

Название: Поиск атрибутов блока без транзакции.
Отправлено: exilerus от 07-05-2018, 10:33:47
Здравствуйте, коллеги.
Возник вопрос, опишу ситуацию.
Есть чертеж, на котором находятся блокреференсы. Есть приложение, которое оценивает блоки по их атрибутам и вносит в таблицу приложения ( я "подписался" на события базы данных, при каждом изменении, добавлении или удалении происходит сканирование чертежа). Сканирование происходит, используя транзакцию.
Проблема в том, что когда я использую другое свое приложение для того, чтобы поместить блок на чертеж, я тоже открываю транзакцию, в этот момент срабатывает событие и я получаю ошибку из-за двух транзакций одновременно.

Подскажите, пожалуйста, что можно с этим сделать. Может быть можно просмотреть все блоки и их атрибуты без использования транзакции?

Заранее спасибо!
Название: Re: Поиск атрибутов блока без транзакции.
Отправлено: Александр Ривилис от 07-05-2018, 10:40:14
Может быть можно просмотреть все блоки и их атрибуты без использования транзакции?
Можно. Два варианта:
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
Название: Re: Поиск атрибутов блока без транзакции.
Отправлено: Александр Ривилис от 07-05-2018, 10:49:58
я "подписался" на события базы данных, при каждом изменении, добавлении или удалении происходит сканирование чертежа
Какая жуть.
Название: Re: Поиск атрибутов блока без транзакции.
Отправлено: exilerus от 07-05-2018, 10:51:36
Спасибо за ответ!
Про "жуть" - это попытка посмотреть на реалтайм.
Есть другие варианты?
Название: Re: Поиск атрибутов блока без транзакции.
Отправлено: avc от 07-05-2018, 10:53:58
Странная ошибка. Разве нельзя держать сколько угодно открытых транзакций? Проблема должна возникать, только если несколько раз будет открыт на запись один и тот же объект. Нет? К тому же по идее событие изменения объекта будет в момент закрытия транзакции, его редактировавшей - т.е. сначала одна транзакция закрывается, потом открывается другая.
Название: Re: Поиск атрибутов блока без транзакции.
Отправлено: Александр Ривилис от 07-05-2018, 10:55:54
Странная ошибка.
Достаточно часто в событиях базы вообще нельзя использовать транзакции.
Название: Re: Поиск атрибутов блока без транзакции.
Отправлено: Александр Ривилис от 07-05-2018, 10:56:41
Есть другие варианты?
Да. Не сканировать базу.
Название: Re: Поиск атрибутов блока без транзакции.
Отправлено: exilerus от 07-05-2018, 10:57:40
Да, Александр прав. Вся ошибка зависит от событий базы.
Не так смертельно будет этого не иметь, но хочется видеть изменения в реальном времени, вот и пробую.
Название: Re: Поиск атрибутов блока без транзакции.
Отправлено: Дмитрий Загорулькин от 07-05-2018, 12:43:23
Разве нельзя держать сколько угодно открытых транзакций?
Можно, конечно.
Проблема должна возникать, только если несколько раз будет открыт на запись один и тот же объект.
Вроде бы, транзакции прощают даже такое.
К тому же по идее событие изменения объекта будет в момент закрытия транзакции, его редактировавшей
Насколько я понимаю - нет. Событие изменения возникает в момент изменения. А при закрытии транзакции происходит закрытие объекта.
Название: Re: Поиск атрибутов блока без транзакции.
Отправлено: Александр Ривилис от 07-05-2018, 12:59:09
Цитата: avc от 07-05-2018, 10:53:58

    К тому же по идее событие изменения объекта будет в момент закрытия транзакции, его редактировавшей

Насколько я понимаю - нет. Событие изменения возникает в момент изменения. А при закрытии транзакции происходит закрытие объекта.
Да. Если подразумевать под закрытием транзакции Commit. Происходит не просто закрытие объекта, а подтверждение изменений. Если нет Commit, то вместо закрытия объекта (Close), происходит отказ от изменений (Abort) и объект восстанавливается к состоянию до его открытия.
Название: Re: Поиск атрибутов блока без транзакции.
Отправлено: Александр Пекшев aka Modis от 20-05-2018, 01:18:37
я "подписался" на события базы данных, при каждом изменении, добавлении или удалении происходит сканирование чертежа
А зачем сканировать все? Почему не смотреть только те объекты, которые "изменились, добавились, удалились"?

Еще есть вариант - следить за изменением состояния блокировки документа. Она вроде как тесно связана с транзакцией. Но это тёмный лес в который опасно ходить и о котором мало написано