Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2010.02.07;
Скачать: [xml.tar.bz2];

Вниз

можно ли сделать 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.005 c
6-1204447263
IntruderLab
2008-03-02 11:41
2010.02.07
TICQClient


15-1259607148
korabok
2009-11-30 21:52
2010.02.07
Как определить что активное приложение - игровое?


15-1259703017
Юрий
2009-12-02 00:30
2010.02.07
С днем рождения ! 2 декабря 2009 среда


15-1259644584
d@nger
2009-12-01 08:16
2010.02.07
проблема с UserGate и сервером


15-1259997701
begin_flasher
2009-12-05 10:21
2010.02.07
Shockwave Flash





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский