|
Оповещение клиентов о добавлении записи в таблицу
|
|||
---|---|---|---|
#18+
Тема не раз поднималась, но конкретного ответа так и не нашёл. Изначально был Firebird. Там всё решалось просто: в триггере на Insert отправляем событие: Код: plsql 1.
а на клиенте была подписка на событие: Код: c# 1. 2.
и в обработчике делай что хочешь с этим. Сейчас нужно перенести всё на MS SQL. Собственно вопрос - как организовать подобное? Читал про Service Broker, но не догоняю, как его можно применить в такой ситуации, слишком он громоздкий, а примеров использования подробных не нашел. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2021, 17:51 |
|
Оповещение клиентов о добавлении записи в таблицу
|
|||
---|---|---|---|
#18+
Чо все на эту deperecated технологию сервис-брокера зациклились? sp_getapplock + асинхронное исполнение запроса на клиенте. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2021, 18:01 |
|
Оповещение клиентов о добавлении записи в таблицу
|
|||
---|---|---|---|
#18+
aleks222, где это ты прочитал что она deprecated? kikipumpa читайте про SqlDependency / SqlNotificationRequest ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2021, 18:31 |
|
Оповещение клиентов о добавлении записи в таблицу
|
|||
---|---|---|---|
#18+
felix_ff, Спасибо, SqlDependency похоже на то, что мне надо. Я правильно понимаю, что если у меня несколько таблиц, то мне надо на каждую делать экземпляр SqlDependency и EventHandler? И SqlDependency работает ведь с сервис-брокером, его нужно настраивать? С одной таблицей вроде бы заработало без настроек, а вот с несколькими пока нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2021, 10:54 |
|
Оповещение клиентов о добавлении записи в таблицу
|
|||
---|---|---|---|
#18+
kikipumpa С одной таблицей вроде бы заработало без настроек Не забудь проверить, что ты не получаешь уведомлений об изменениях, сделанных в транзакции, закончившейся откатом. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2021, 15:03 |
|
Оповещение клиентов о добавлении записи в таблицу
|
|||
---|---|---|---|
#18+
kikipumpa felix_ff, Спасибо, SqlDependency похоже на то, что мне надо. Я правильно понимаю, что если у меня несколько таблиц, то мне надо на каждую делать экземпляр SqlDependency и EventHandler? И SqlDependency работает ведь с сервис-брокером, его нужно настраивать? С одной таблицей вроде бы заработало без настроек, а вот с несколькими пока нет. да SqlDependency это надстройка над SqlNotificationRequest которая собственно работает через ServiceBroker. Все что нужно это включить брокер на базе данных которую собираетесь отслеживать: Код: sql 1. 2.
у SqlDependency есть ограничения и довольно много. отслеживаются в основном "тривиальные запросы" https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms181122(v=sql.105)?redirectedfrom=MSDN Единственный неудобный момент что зарегистрированный SqlDependency реагирует единожды на событие, и после этого его нужно заново регистрировать. из-за этого код обработчика получается несколько громоздким. точнее есть еще неприятная хрень - это настройки SET. в каких нибудь legacy-говно базах иногда не получается использовать ее. Не забудь проверить, что ты не получаешь уведомлений об изменениях, сделанных в транзакции, закончившейся откатом. ноуп. эта штука уведомляет даже при откате транзакции. смысл в том что зарегистрированный SqlNotificationRequest на таблице используется оптимизатором запросов, и все DML инструкции видоизменяют план запроса. фиксация подписки проиходит всегда, вне зависимости контекста транзакции, так что сообщение ложится в очередь в любом случае. https://docs.microsoft.com/ru-ru/sql/relational-databases/native-client/features/working-with-query-notifications?view=sql-server-ver15 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2021, 15:33 |
|
Оповещение клиентов о добавлении записи в таблицу
|
|||
---|---|---|---|
#18+
felix_ff, Не забудь проверить, что ты не получаешь уведомлений об изменениях, сделанных в транзакции, закончившейся откатом. ноуп. эта штука уведомляет даже при откате транзакции. смысл в том что зарегистрированный SqlNotificationRequest на таблице используется оптимизатором запросов, и все DML инструкции видоизменяют план запроса. фиксация подписки проиходит всегда, вне зависимости контекста транзакции, так что сообщение ложится в очередь в любом случае. https://docs.microsoft.com/ru-ru/sql/relational-databases/native-client/features/working-with-query-notifications?view=sql-server-ver15 То есть на клиенте я не смогу узнать, чем закончилась транзакция? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2021, 17:51 |
|
Оповещение клиентов о добавлении записи в таблицу
|
|||
---|---|---|---|
#18+
kikipumpa, ну всмысле не можете узнать? к примеру лежат у вас в табличке данные: Код: sql 1. 2. 3.
вы хотите знать когда изменяются строки с типом type = 2 делаете подписку на команду: Код: sql 1.
далее какая то сессия выполняет: Код: sql 1. 2. 3. 4. 5. 6. 7.
но при каждом поступлении уведомления вы же заранее знаете на что подписывались. сработало событие OnChange вы на клиенте можете взять и заселектить набор данных, а как вы уже данные обрабатываете это непосредственно логика клиента можно сделать так что первым фетчем перед подпиской вы получаете набор данных и сохраняете к примеру в DataTable, инстанцируете SqlDependency как только срабатывает OnChange, вы селектите набор данных и сравниваете две DataTable если различия есть значит Commit был. причем у делегата OnChangeEventHandler аргумент SqlNotificationEventArgs тоже имеет много свойств описывающих событие. ( но вроде на откат там никаких флагов на моей памяти нет) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2021, 18:43 |
|
Оповещение клиентов о добавлении записи в таблицу
|
|||
---|---|---|---|
#18+
felix_ff, felix_ffвы селектите набор данных и сравниваете две DataTable если различия есть значит Commit был. ну это то понятно, я имел в виду из уведомления узнать. В общем, спасибо, разобрался. Всё оказалось проще, чем казалось. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 12:37 |
|
Оповещение клиентов о добавлении записи в таблицу
|
|||
---|---|---|---|
#18+
felix_ff сработало событие OnChange вы на клиенте можете взять и заселектить набор данных А если оно сработало ещё до коммита пишущей транзакции - придётся использовать уровень изоляции dirty read?.. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 14:34 |
|
Оповещение клиентов о добавлении записи в таблицу
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov felix_ff сработало событие OnChange вы на клиенте можете взять и заселектить набор данных А если оно сработало ещё до коммита пишущей транзакции - придётся использовать уровень изоляции dirty read?.. хм :) хороший вопрос. да, но тогда мы прочитаем незакоммиченные данные и нифига не поймем будет ли последующий коммит или нет. я бы в таком случае ввел некую условность в виде: по уведомлению читаем набор с read committed и выставляем commandTimeout равным некоему предопределенному времени которое мы считаем приемлемым для завершения почти любой операции с таблицей. (подбирается эмперически) вычитка блокируется на момент работы транзакции, если транзакция за наше "приемлемое время" завершится коммитом или роллбеком мы узнаем результат, если получим SqlException по таймауту, то будем считать что транзакция длинная ну и предпринимаем или еще попытки вычитки или применяем какую то другую логику обработки согласен что с явными долгими транзакциями данная технология уведомлений возможно не идеальный вариант, она обычно хорошо работает когда в базе по большей части все dml используются под обычным autocommit, без явных транзакций ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 14:45 |
|
|
start [/forum/search_topic.php?author=Egorka21&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
159ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 24ms |
total: | 299ms |
0 / 0 |