powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не работает dbcancel, db-library, MS SQL
13 сообщений из 13, страница 1 из 1
Не работает dbcancel, db-library, MS SQL
    #38218205
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет

Почему-то не отменяется select к БД (MS SQL) при работе через db Library

1) Заворачиваю Select к БД через dbcmd(dbproc, "Select...")
2) Запускаю выполнение запроса ret_code=dbsqlexec(dbproc);

Запрос работает в БД, строки по нему не едут dbsqlexec управление не возвращает

3) В другом потоке вызываю dbcancel(dbproc), функция возвращает успех

Select продолжает готовить выборку строк

Подскажите, что я делаю не так???
...
Рейтинг: 0 / 0
Не работает dbcancel, db-library, MS SQL
    #38219321
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все так, только отмена это не мгновенная операция. После db_cancel() сервер начинает останавливать работающий запрос, потом очищает уже подготовленный кусок результата, потом чистит свои внутренние буфера, потом сообщает клиенту. Потом интерфейсный драйвер на стороне клиента начинает очищать свои приемные буфера. И только потом dbsqlexec() вернется с ошибкой отмены.
Соответственно, чем более тяжелый запрос был запущен изначально, тем дольше будет работать операция отмены.
...
Рейтинг: 0 / 0
Не работает dbcancel, db-library, MS SQL
    #38219368
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подозрительно долго не возвращается управление.
К примеру в OleDB запрос прерывается сразу же после выполнения ICommand::Cancel у команды.
...
Рейтинг: 0 / 0
Не работает dbcancel, db-library, MS SQL
    #38219396
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artiiВсем привет

Почему-то не отменяется select к БД (MS SQL) при работе через db Library

1) Заворачиваю Select к БД через dbcmd(dbproc, "Select...")
2) Запускаю выполнение запроса ret_code=dbsqlexec(dbproc);

Запрос работает в БД, строки по нему не едут dbsqlexec управление не возвращает

3) В другом потоке вызываю dbcancel(dbproc), функция возвращает успех

Select продолжает готовить выборку строк

Подскажите, что я делаю не так???

dbcancel() и подобные функции никогда не будут так работать (т.е. асинхронно).

Он сработает, когда клиентское приложение получит управление для получения первой порции данных, вот тогда ты сможешь не выбирая остальные данные вызвать эту функцию для отмены выборки остальных строк и наборов.

Вообще, выполняющийся запрос по хорошему нельзя остановить. Иногда поможет команда kill, но она привилегированная.
...
Рейтинг: 0 / 0
Не работает dbcancel, db-library, MS SQL
    #38219422
MasterZivВообще, выполняющийся запрос по хорошему нельзя остановить. Иногда поможет команда kill, но она привилегированная.
А в этом есть какая-то здравая логика?
Допустим случайно вместо знака больше, поставили знак меньше в предикатах и отправили запрос на выполнение на пару дней или недель. Если я его запускал, то почему мне нужна какая-то привилегия, чтобы мой запрос тут же остановить?
...
Рейтинг: 0 / 0
Не работает dbcancel, db-library, MS SQL
    #38219447
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здравая логикаЕсли я его запускал, то почему мне нужна какая-то привилегия, чтобы мой запрос тут же остановить?Привилегии не требуются - нужны ресурсы.
...
Рейтинг: 0 / 0
Не работает dbcancel, db-library, MS SQL
    #38219449
Basil A. Sidorovздравая логикаЕсли я его запускал, то почему мне нужна какая-то привилегия, чтобы мой запрос тут же остановить?Привилегии не требуются - нужны ресурсы.
Какие ресурсы и их нужно больше чем для выполнения 2х дневного запроса?
...
Рейтинг: 0 / 0
Не работает dbcancel, db-library, MS SQL
    #38219482
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие ресурсыКакие ресурсы и их нужно больше чем для выполнения 2х дневного запроса?Простейший случай - модифицирующий запрос:
Код: sql
1.
update таблица(поле) set поле = значение

забыли where и пошли модифицировать большую таблицу.
Если запрос отменяется, то целостность требует сделать (неявный) rollback - чем больше модифицировали, тем дольше откатывать.
Если просто "тяжёлый" select, то будут проблемы при конкурентном доступе - изолированность потребует создания версий или генерации журналов отката.
...
Рейтинг: 0 / 0
Не работает dbcancel, db-library, MS SQL
    #38219510
Basil A. SidorovКакие ресурсыКакие ресурсы и их нужно больше чем для выполнения 2х дневного запроса?Простейший случай - модифицирующий запрос:
Код: sql
1.
update таблица(поле) set поле = значение

забыли where и пошли модифицировать большую таблицу.
Если запрос отменяется, то целостность требует сделать (неявный) rollback - чем больше модифицировали, тем дольше откатывать.
Если просто "тяжёлый" select, то будут проблемы при конкурентном доступе - изолированность потребует создания версий или генерации журналов отката.
Это вы правильно заметили про DML. Что данные из андо будут обратно откатываться в базу данных.
Но автор то про Select:
artiiВсем привет

Почему-то не отменяется select к БД (MS SQL) при работе через db Library

1) Заворачиваю Select к БД через dbcmd(dbproc, "Select...")
...
Рейтинг: 0 / 0
Не работает dbcancel, db-library, MS SQL
    #38219621
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здравая логикаMasterZivВообще, выполняющийся запрос по хорошему нельзя остановить. Иногда поможет команда kill, но она привилегированная.
А в этом есть какая-то здравая логика?
Допустим случайно вместо знака больше, поставили знак меньше в предикатах и отправили запрос на выполнение на пару дней или недель. Если я его запускал, то почему мне нужна какая-то привилегия, чтобы мой запрос тут же остановить?

Это вопрос не ко мне и не для этого форума.
Логика такова, что kill может убить любую сессию, а не только свою. Поэтому это нельзя делать.
А чтобы убить только свою одну сессию, приложение может просто закрыть эту сессию, соединение с сервером.
...
Рейтинг: 0 / 0
Не работает dbcancel, db-library, MS SQL
    #38219623
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор то про Select,

Там дело больше даже не в привилегиях, а в том, что взаимодействие клиента и сервера строго синхронное.
Даже kill если вы выполните, то это далеко не всегда сразу остановит выполняющийся запрос.
...
Рейтинг: 0 / 0
Не работает dbcancel, db-library, MS SQL
    #38219634
MasterZivавтор то про Select,

Там дело больше даже не в привилегиях, а в том, что взаимодействие клиента и сервера строго синхронное.
Даже kill если вы выполните, то это далеко не всегда сразу остановит выполняющийся запрос.
А причем тут синхронное взаимодействие? kill-то по любому надо будет вызывать в другой сессии, т.е. асинхронно.
...
Рейтинг: 0 / 0
Не работает dbcancel, db-library, MS SQL
    #38220007
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в другой сессии, т.е. асинхронноMasterZivавтор то про Select,

Там дело больше даже не в привилегиях, а в том, что взаимодействие клиента и сервера строго синхронное.
Даже kill если вы выполните, то это далеко не всегда сразу остановит выполняющийся запрос.
А причем тут синхронное взаимодействие? kill-то по любому надо будет вызывать в другой сессии, т.е. асинхронно.

Так точно, в другой. Я это в общем говорил. О всей проблеме.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не работает dbcancel, db-library, MS SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]