Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.07;
Скачать: CL | DM;

Вниз

можно ли сделать delay в ХП IB7.5?   Найти похожие ветки 

 
July   (2009-02-11 11:08) [0]

Здравствуйте!
Собственно вопрос коротко - в теме.
Т.е. ищу возможность, подобную функции waitfor в SQL-Server.
Нужно с целью иметь возможность подождать несколько секунд и сделать повторную попытку проверки данных и так несколько раз, прежде чем отвалить сообщение, что допустимое время ожидания истекло. Ну или,  если какая-то из попыток оказалась успешной, продолжить работу процедуры.
Очень желательно сделать это не из приложения, а именно внутри хранимой процедуры БД.
Возможно ли это в Interbase  в принципе?


 
Сергей М. ©   (2009-02-11 11:21) [1]


> попытку проверки данных


Каких ?
Конкретней ..


 
July   (2009-02-11 11:29) [2]


> Каких ?

Просто запросом читаю поле из обычной таблицы, если оно <>0, надо подождать, иначе - все ОК и поехали дальше


 
Сергей М. ©   (2009-02-11 11:42) [3]


> если оно <>0, надо подождать


Эдак ты у моря погоды будешь ждать, до самого морковкиного заговения)
Про уровни изоляции транзакций что-нибудь слышала ?


 
July   (2009-02-11 11:51) [4]

Слышала, слышала :)
Read commited
правда что-то я засомневалась, правильно ли я понимала..
я думала, что при таком уровне, если во время выполнения моей процедуры другой транзакцией данные будут изменены и сделан commit, в процедуре это станет видно, ..не правильно?


 
Сергей М. ©   (2009-02-11 11:56) [5]


> не правильно?


Конечно нет)


 
Кщд   (2009-02-11 11:59) [6]

>July   (11.02.09 11:51) [4]
правильно

а вот делать delay, скорее всего, неправильно
но, впрочем, в Вашем посте нет информации "против" такого подхода, но нет и "за"


 
Сергей М. ©   (2009-02-11 12:00) [7]


> July


Ты, похоже, таким макаром пытаешься эмулировать блокировку одновременного доступа к записи ?


 
July   (2009-02-11 12:01) [8]

Тогда поправьте, если не трудно.
Что же, даже если процедура делается в рамках транзакции с уровнем read commited, для операторов, которые внутри нее действуют другие правила?


 
Johnmen ©   (2009-02-11 12:01) [9]


> Сергей М. ©   (11.02.09 11:56) [5]

Я думаю, что будет.


 
Кщд   (2009-02-11 12:02) [10]

>Сергей М. ©   (11.02.09 11:56) [5]
это какая-то уникальная фича IB7.5 - не видеть данных, подтвержденных другой транзакцией, при уровне read committed?


 
Кщд   (2009-02-11 12:05) [11]

>July   (11.02.09 12:01) [8]
никаких "других" правил
процедура выполняется в контексте транзакции


 
July   (2009-02-11 12:07) [12]


> Ты, похоже, таким макаром пытаешься эмулировать блокировку
> одновременного доступа к записи ?

угадали :)
извращенский способ, да? :)
другого в голову пока не пришло..

Johnmen
> Я думаю, что будет.


Я смотрю есть разногласия по этому вопросу.
Так или иначе, я бы с этим разобралась, если бы была возможность поэкспериментировать.
А пока я возилась с переменными типа timestamp, пыталась манипулировать вычислениями истеrшего времени, но что-то ничего не получается..

to Кщд - может и не понадобиться, придумается что-нибудь более умное, но это не главный вопрос в данный момент вопрос, который занимает - мне просто нужно уяснить, можно ли вообще технически сделать вручную delay внутри процедуры Interbase?


 
Сергей М. ©   (2009-02-11 12:08) [13]


> Конечно нет


Да, это я ляпнул - прочитал одно, а думал про другое.


> July


Ответишь на [7] ?


 
Сергей М. ©   (2009-02-11 12:11) [14]

http://www.ibase.ru/devinfo/pslock.htm


 
Johnmen ©   (2009-02-11 12:12) [15]


> July   (11.02.09 12:07) [12]

1. Если это про указанное извращение, то оно никому не нужно. Даже тебе.
2. Задержку делаешь циклом с проверкой наперед заданного времени.


 
July   (2009-02-11 12:18) [16]

на [13] см. [12]
поясню, откуда такая идея - просто эта проверяемая запись - флаг, означающий, выполняется ли еще некая обработка над совокупностью данных, имеющая некоторое отношение к этой записи.
Так туманно - совокупность, потому что данные по нескольким таблицам, не всегда непосредсвенно связанным, чтобы просто положиться на автоматическую проверку целостности и обработка тоже достаточно навороченная и растянутая по времени, короче говоря это все приводит к тому, что гарантий, которые дает манипулирование настройками уровнями изоляций, недостаточно, приходится раздумывать над добавлением своих таких вот извращенских методов.
Я знаю, что это все из-за изначально заложенной в базу избыточности, эта тема отдельная, сейчас не о ней.


 
Сергей М. ©   (2009-02-11 12:26) [17]


> July   (11.02.09 12:18) [16]


Почему бы тогда не обратить взов в сторону 3-хзвенки, где 2-е звено - аппсервер - могло бы, например, сериализовать сложные задания или же предоставлять для клиентов подобного рода семафорный сервис ?


 
Johnmen ©   (2009-02-11 12:29) [18]


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

А что, значение этого флага однозначно говорит, выполняется или нет? И кто выставляет этот флаг?


 
July   (2009-02-11 12:37) [19]


> Сергей М. ©   (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:43) [20]

t=current_timestamp+<здесь желаемое время задержки в сутках>;
while current_timestamp<t do;


 
July   (2009-02-11 12:46) [21]


> Сергей М. ©   (11.02.09 12:26) [17]

Может быть когда-нибудь на бу-у-удущее, да :)
Пока эта система на клиент-сервере, сделана достаточно давно, серьезные архитектурные переделки на горизонте ей пока не светят, есть более актуальные разработки, так что пока вот так..
Но проблема, из-за которой этот вопрос возник, к счастью, достаточно редкая, для нее хватило бы и скромной заплатки..


 
Кщд   (2009-02-11 12:51) [22]

>серьезные архитектурные переделки на горизонте ей пока не светят
прошу прощения за оффтоп, но, судя по Вашему описанию этой системы, ей светит архитектурная смерть)


 
Сергей М. ©   (2009-02-11 12:58) [23]


> July   (11.02.09 12:46) [21]


А задействование UDF тоже относится к "серьезные архитектурные переделки" ?


 
July   (2009-02-11 13:06) [24]


> 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 13:17) [25]

>тогда для моих 10 сек. надо вместо делить на 24 вместо 2-х - (1:60):6=0,0028 ?

10/24/60/60


 
July   (2009-02-11 13:22) [26]


> А задействование UDF тоже относится к "серьезные архитектурные
> переделки" ?


Ну, думаю что нет :)
А то, что вы предлагали в [17] можно сделать с помощью UDF?
Боюсь, что самостоятельно такое не осилю..


 
Сергей М. ©   (2009-02-11 13:38) [27]


> то, что вы предлагали в [17] можно сделать с помощью UDF?


Ну уж если извращаться, то почему бы и нет ?


> Боюсь, что самостоятельно такое не осилю


А мы тут все зачем торчим денно и нощно ?
Не можешь - поможем, не хочешь - заставим)


 
July   (2009-02-11 15:28) [28]


> Сергей М. ©   (11.02.09 13:38) [27]


Ну, разве что delay этот вынести в UDF?  :)

Видимо придется попробовать, потому что калькуляции с timestamp что-то не помогают.
Кщд, спасибо, делала такой цикл, под отладкой вижу, что все нормально, у переменной время на 10 сек больше текущего, но при запуске все повисает намертво, будто процедура никогда не дожидается этого момента. Хотя под отладкой (IBExpert) наоборот - поведение, как будто условие сразу выполнилось.


 
Сергей М. ©   (2009-02-11 15:32) [29]


> Ну, разве что delay этот вынести в UDF?


Для настоящего извращения delay слишком примитивен)


 
MsGuns ©   (2009-02-11 16:45) [30]

Преклоняю коленки перед мастерами, чего-то отвечающими по сабжу, из которого абсолютно неясно, ЗАЧЕМ делается какая-то задержка перед извлечением данных с сервера, да к тому же средствами самого сервера :) ИМХО, автор потеряла лез даже не за тремя соснами, а перед единственным пеньком.
А объяснить СУТЬ ЗАДАЧИ, очевидно, секьюрити не позволяет :)


 
Petr V. Abramov ©   (2009-02-11 17:32) [31]


> July   (11.02.09 11:29) [2]
>
> > Каких ?
>
> Просто запросом читаю поле из обычной таблицы, если оно
> <>0, надо подождать, иначе - все ОК и поехали дальше

если оно  <>0,это значит, что оно либо 0<>, либо другая транзакция его уже в ноль поставила, но еще не закоммитилась, и когда ты начнешь чего-нить делать, оно давно будет 0=.
Так что брось свою затею


 
July   (2009-02-12 10:38) [32]


> Petr V. Abramov ©   (11.02.09 17:32) [31]

Точно!  да,  "слона-то я и не заметил" :)
бросаю..


 
Виталий Панасенко   (2009-02-12 11:03) [33]

а это не поможет?
http://ibase.ru/devinfo/ibtrans.htm


 
July   (2009-02-12 11:09) [34]

Спасибо, это вообще очень помогает :)


 
Виталий Панасенко   (2009-02-12 11:15) [35]


> SNAPSHOT TABLE STABILITY (константа consistency) - изолированность
> образа (воспроизводимое чтение), при обращении к таблицам
> блокирует к ним доступ (как минимум на изменения, целиком
> для всей таблицы, см. дальше резервирование таблиц).
>


по-моему, где-то рядом


 
July   (2009-02-12 12:44) [36]


> Виталий Панасенко   (12.02.09 11:15) [35]


манипулирование уровнями мне не подходит


> Сергей М.


Спасибо еще раз за статью, кажется в моем случае подойдет идея "глотания бильярдного шара с холостыми update-ами" :)

Всех благодарю за внимание!



Страницы: 1 вся ветка

Текущий архив: 2010.02.07;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.011 c
8-1202734993
jusalex
2008-02-11 16:03
2010.02.07
Использование TALWavePlayer из AudioLab


1-1229882763
mefodiy
2008-12-21 21:06
2010.02.07
Центрирование содержимого ячейки по вертикали в таблице Word


2-1260371106
Timur&Co
2009-12-09 18:05
2010.02.07
Прозрачность TListView


11-1211058152
foxnsk
2008-05-18 01:02
2010.02.07
Определение событий средствами MCK


3-1234343484
TTLr
2009-02-11 12:11
2010.02.07
Сортировка