![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
можно ли сделать delay в ХП IB7.5? [IB7.5]
July © (2009-02-11 11:08:00)Здравствуйте!
Собственно вопрос коротко - в теме.
Т.е. ищу возможность, подобную функции waitfor в SQL-Server.
Нужно с целью иметь возможность подождать несколько секунд и сделать повторную попытку проверки данных и так несколько раз, прежде чем отвалить сообщение, что допустимое время ожидания истекло. Ну или, если какая-то из попыток оказалась успешной, продолжить работу процедуры.
Очень желательно сделать это не из приложения, а именно внутри хранимой процедуры БД.
Возможно ли это в Interbase в принципе?
July (2009-02-12 12:44:00) [1]
> Виталий Панасенко (12.02.09 11:15) [35]
манипулирование уровнями мне не подходит
> Сергей М.
Спасибо еще раз за статью, кажется в моем случае подойдет идея "глотания бильярдного шара с холостыми update-ами" :)
Всех благодарю за внимание!
Виталий Панасенко (2009-02-12 11:15:00) [2]
> SNAPSHOT TABLE STABILITY (константа consistency) - изолированность
> образа (воспроизводимое чтение), при обращении к таблицам
> блокирует к ним доступ (как минимум на изменения, целиком
> для всей таблицы, см. дальше резервирование таблиц).
>
по-моему, где-то рядом
July (2009-02-12 11:09:00) [3]Спасибо, это вообще очень помогает :)
Виталий Панасенко (2009-02-12 11:03:00) [4]а это не поможет?
http://ibase.ru/devinfo/ibtrans.htm
July (2009-02-12 10:38:00) [5]
> Petr V. Abramov © (11.02.09 17:32) [31]
Точно! да, "слона-то я и не заметил" :)
бросаю..
Petr V. Abramov (2009-02-11 17:32:00) [6]
> July (11.02.09 11:29) [2]
>
> > Каких ?
>
> Просто запросом читаю поле из обычной таблицы, если оно
> <>0, надо подождать, иначе - все ОК и поехали дальше
если оно <>0,это значит, что оно либо 0<>, либо другая транзакция его уже в ноль поставила, но еще не закоммитилась, и когда ты начнешь чего-нить делать, оно давно будет 0=.
Так что брось свою затею
MsGuns (2009-02-11 16:45:00) [7]Преклоняю коленки перед мастерами, чего-то отвечающими по сабжу, из которого абсолютно неясно, ЗАЧЕМ делается какая-то задержка перед извлечением данных с сервера, да к тому же средствами самого сервера :) ИМХО, автор потеряла лез даже не за тремя соснами, а перед единственным пеньком.
А объяснить СУТЬ ЗАДАЧИ, очевидно, секьюрити не позволяет :)
Сергей М. (2009-02-11 15:32:00) [8]
> Ну, разве что delay этот вынести в UDF?
Для настоящего извращения delay слишком примитивен)
July (2009-02-11 15:28:00) [9]
> Сергей М. © (11.02.09 13:38) [27]
Ну, разве что delay этот вынести в UDF? :)
Видимо придется попробовать, потому что калькуляции с timestamp что-то не помогают.
Кщд, спасибо, делала такой цикл, под отладкой вижу, что все нормально, у переменной время на 10 сек больше текущего, но при запуске все повисает намертво, будто процедура никогда не дожидается этого момента. Хотя под отладкой (IBExpert) наоборот - поведение, как будто условие сразу выполнилось.
Сергей М. (2009-02-11 13:38:00) [10]
> то, что вы предлагали в [17] можно сделать с помощью UDF?
Ну уж если извращаться, то почему бы и нет ?
> Боюсь, что самостоятельно такое не осилю
А мы тут все зачем торчим денно и нощно ?
Не можешь - поможем, не хочешь - заставим)
July (2009-02-11 13:22:00) [11]
> А задействование UDF тоже относится к "серьезные архитектурные
> переделки" ?
Ну, думаю что нет :)
А то, что вы предлагали в [17] можно сделать с помощью UDF?
Боюсь, что самостоятельно такое не осилю..
Кщд (2009-02-11 13:17:00) [12]>тогда для моих 10 сек. надо вместо делить на 24 вместо 2-х - (1:60):6=0,0028 ?
10/24/60/60
July (2009-02-11 13:06:00) [13]
> Johnmen © (11.02.09 12:29) [18]
А что, значение этого флага однозначно говорит, выполняется или нет? И кто выставляет этот флаг?
Ну, он появится только если я действительно оставлю этот способ работы :)
Тогда он бы и выставлялся, после проверки, если уже не занят (именно в нужной записи), запускалась нужная обработка (зависящая именно от этой записи), после снимался бы.
Надеюсь все-таки обойтись без изобретения велосипедов..
> Johnmen © (11.02.09 12:43) [20]
> t=current_timestamp+<здесь желаемое время задержки в сутках>;
>
> while current_timestamp<t do;
вот если <желаемое время задержки в сутках> те 10 сек, как это указать?
вычитала в примере из http://plagiata.net.ru/?p=411
Как отнимать или добавлять части суток к переменной типа Timestamp?
Нужно просто прибавить или отнять от переменной типа Timestamp количество секунд. Этот пример показывает, какая будет дата и время через 2 часа.
select current_timestamp + (2.0 / 24.0) from rdb$database
..и что-то я все таки туплю :)
тогда для моих 10 сек. надо вместо делить на 24 вместо 2-х -
(1:60):6=0,0028 ?
или если в формате timestamp - что тогда писать в качестве дня-месяца-года?
спасибо за советы!
Сергей М. (2009-02-11 12:58:00) [14]
> July (11.02.09 12:46) [21]
А задействование UDF тоже относится к "серьезные архитектурные переделки" ?
Кщд (2009-02-11 12:51:00) [15]>серьезные архитектурные переделки на горизонте ей пока не светят
прошу прощения за оффтоп, но, судя по Вашему описанию этой системы, ей светит архитектурная смерть)
July (2009-02-11 12:46:00) [16]
> Сергей М. © (11.02.09 12:26) [17]
Может быть когда-нибудь на бу-у-удущее, да :)
Пока эта система на клиент-сервере, сделана достаточно давно, серьезные архитектурные переделки на горизонте ей пока не светят, есть более актуальные разработки, так что пока вот так..
Но проблема, из-за которой этот вопрос возник, к счастью, достаточно редкая, для нее хватило бы и скромной заплатки..
Johnmen (2009-02-11 12:43:00) [17]
t=current_timestamp+<здесь желаемое время задержки в сутках>;
while current_timestamp<t do;
July (2009-02-11 12:37:00) [18]
> Сергей М. © (11.02.09 12:11) [14]
Спасибо, почитаю
> Johnmen © (11.02.09 12:12) [15]
1. Если это про указанное извращение, то оно никому не нужно. Даже тебе.
2. Задержку делаешь циклом с проверкой наперед заданного времени.
Ну, я понимаю, что скорее всего правильнее без таких-вот наворотов вручную..
Но п.2 для удовлетворения любопытства попробую.
Я не все еще понимаю при работе с переменными временного типа, может подскажете, почему так:
пробовала вот этот кусок проверять по шагам:
t1=current_timestamp;
t2=current_timestamp;
dif=cast((t2-t1) as float);
while (dif<=0.0001)
do begin t2=current_timestamp;
dif=cast((t2-t1) as float);
end
сколько бы ни проходило времени, dif всегда равно 0, не важно, с cast или без него. cast попробовала приписать уже потом
цифра 0.0001 это где-то 10 сек.
о математических операциях с такими типами читала здесь:
http://plagiata.net.ru/?p=411
Johnmen (2009-02-11 12:29:00) [19]
> просто эта проверяемая запись - флаг, означающий, выполняется
> ли еще некая обработка над совокупностью данных, имеющая
> некоторое отношение к этой записи.
А что, значение этого флага однозначно говорит, выполняется или нет? И кто выставляет этот флаг?
Сергей М. (2009-02-11 12:26:00) [20]
> July (11.02.09 12:18) [16]
Почему бы тогда не обратить взов в сторону 3-хзвенки, где 2-е звено - аппсервер - могло бы, например, сериализовать сложные задания или же предоставлять для клиентов подобного рода семафорный сервис ?