-
Здравствуйте! Собственно вопрос коротко - в теме. Т.е. ищу возможность, подобную функции waitfor в SQL-Server. Нужно с целью иметь возможность подождать несколько секунд и сделать повторную попытку проверки данных и так несколько раз, прежде чем отвалить сообщение, что допустимое время ожидания истекло. Ну или, если какая-то из попыток оказалась успешной, продолжить работу процедуры. Очень желательно сделать это не из приложения, а именно внутри хранимой процедуры БД. Возможно ли это в Interbase в принципе?
-
> попытку проверки данных
Каких ? Конкретней ..
-
> Каких ?
Просто запросом читаю поле из обычной таблицы, если оно <>0, надо подождать, иначе - все ОК и поехали дальше
-
> если оно <>0, надо подождать
Эдак ты у моря погоды будешь ждать, до самого морковкиного заговения) Про уровни изоляции транзакций что-нибудь слышала ?
-
Слышала, слышала :) Read commited правда что-то я засомневалась, правильно ли я понимала.. я думала, что при таком уровне, если во время выполнения моей процедуры другой транзакцией данные будут изменены и сделан commit, в процедуре это станет видно, ..не правильно?
-
> не правильно?
Конечно нет)
-
>July (11.02.09 11:51) [4] правильно
а вот делать delay, скорее всего, неправильно но, впрочем, в Вашем посте нет информации "против" такого подхода, но нет и "за"
-
> July
Ты, похоже, таким макаром пытаешься эмулировать блокировку одновременного доступа к записи ?
-
Тогда поправьте, если не трудно. Что же, даже если процедура делается в рамках транзакции с уровнем read commited, для операторов, которые внутри нее действуют другие правила?
-
> Сергей М. © (11.02.09 11:56) [5]
Я думаю, что будет.
-
>Сергей М. © (11.02.09 11:56) [5] это какая-то уникальная фича IB7.5 - не видеть данных, подтвержденных другой транзакцией, при уровне read committed?
-
>July (11.02.09 12:01) [8] никаких "других" правил процедура выполняется в контексте транзакции
-
> Ты, похоже, таким макаром пытаешься эмулировать блокировку > одновременного доступа к записи ?
угадали :) извращенский способ, да? :) другого в голову пока не пришло..
Johnmen > Я думаю, что будет.
Я смотрю есть разногласия по этому вопросу. Так или иначе, я бы с этим разобралась, если бы была возможность поэкспериментировать. А пока я возилась с переменными типа timestamp, пыталась манипулировать вычислениями истеrшего времени, но что-то ничего не получается..
to Кщд - может и не понадобиться, придумается что-нибудь более умное, но это не главный вопрос в данный момент вопрос, который занимает - мне просто нужно уяснить, можно ли вообще технически сделать вручную delay внутри процедуры Interbase?
-
> Конечно нет
Да, это я ляпнул - прочитал одно, а думал про другое.
> July
Ответишь на [7] ?
-
-
> July (11.02.09 12:07) [12]
1. Если это про указанное извращение, то оно никому не нужно. Даже тебе. 2. Задержку делаешь циклом с проверкой наперед заданного времени.
-
на [13] см. [12] поясню, откуда такая идея - просто эта проверяемая запись - флаг, означающий, выполняется ли еще некая обработка над совокупностью данных, имеющая некоторое отношение к этой записи. Так туманно - совокупность, потому что данные по нескольким таблицам, не всегда непосредсвенно связанным, чтобы просто положиться на автоматическую проверку целостности и обработка тоже достаточно навороченная и растянутая по времени, короче говоря это все приводит к тому, что гарантий, которые дает манипулирование настройками уровнями изоляций, недостаточно, приходится раздумывать над добавлением своих таких вот извращенских методов. Я знаю, что это все из-за изначально заложенной в базу избыточности, эта тема отдельная, сейчас не о ней.
-
> July (11.02.09 12:18) [16]
Почему бы тогда не обратить взов в сторону 3-хзвенки, где 2-е звено - аппсервер - могло бы, например, сериализовать сложные задания или же предоставлять для клиентов подобного рода семафорный сервис ?
-
> просто эта проверяемая запись - флаг, означающий, выполняется > ли еще некая обработка над совокупностью данных, имеющая > некоторое отношение к этой записи.
А что, значение этого флага однозначно говорит, выполняется или нет? И кто выставляет этот флаг?
-
> Сергей М. © (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
-
t=current_timestamp+<здесь желаемое время задержки в сутках>;
while current_timestamp<t do;
-
> Сергей М. © (11.02.09 12:26) [17]
Может быть когда-нибудь на бу-у-удущее, да :) Пока эта система на клиент-сервере, сделана достаточно давно, серьезные архитектурные переделки на горизонте ей пока не светят, есть более актуальные разработки, так что пока вот так.. Но проблема, из-за которой этот вопрос возник, к счастью, достаточно редкая, для нее хватило бы и скромной заплатки..
-
>серьезные архитектурные переделки на горизонте ей пока не светят прошу прощения за оффтоп, но, судя по Вашему описанию этой системы, ей светит архитектурная смерть)
-
> July (11.02.09 12:46) [21]
А задействование UDF тоже относится к "серьезные архитектурные переделки" ?
-
> 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 - что тогда писать в качестве дня-месяца-года? спасибо за советы!
-
>тогда для моих 10 сек. надо вместо делить на 24 вместо 2-х - (1:60):6=0,0028 ?
10/24/60/60
-
> А задействование UDF тоже относится к "серьезные архитектурные > переделки" ?
Ну, думаю что нет :) А то, что вы предлагали в [17] можно сделать с помощью UDF? Боюсь, что самостоятельно такое не осилю..
-
> то, что вы предлагали в [17] можно сделать с помощью UDF?
Ну уж если извращаться, то почему бы и нет ?
> Боюсь, что самостоятельно такое не осилю
А мы тут все зачем торчим денно и нощно ? Не можешь - поможем, не хочешь - заставим)
-
> Сергей М. © (11.02.09 13:38) [27]
Ну, разве что delay этот вынести в UDF? :)
Видимо придется попробовать, потому что калькуляции с timestamp что-то не помогают. Кщд, спасибо, делала такой цикл, под отладкой вижу, что все нормально, у переменной время на 10 сек больше текущего, но при запуске все повисает намертво, будто процедура никогда не дожидается этого момента. Хотя под отладкой (IBExpert) наоборот - поведение, как будто условие сразу выполнилось.
-
> Ну, разве что delay этот вынести в UDF?
Для настоящего извращения delay слишком примитивен)
-
Преклоняю коленки перед мастерами, чего-то отвечающими по сабжу, из которого абсолютно неясно, ЗАЧЕМ делается какая-то задержка перед извлечением данных с сервера, да к тому же средствами самого сервера :) ИМХО, автор потеряла лез даже не за тремя соснами, а перед единственным пеньком. А объяснить СУТЬ ЗАДАЧИ, очевидно, секьюрити не позволяет :)
-
> July (11.02.09 11:29) [2] > > > Каких ? > > Просто запросом читаю поле из обычной таблицы, если оно > <>0, надо подождать, иначе - все ОК и поехали дальше
если оно <>0,это значит, что оно либо 0<>, либо другая транзакция его уже в ноль поставила, но еще не закоммитилась, и когда ты начнешь чего-нить делать, оно давно будет 0=. Так что брось свою затею
-
> Petr V. Abramov © (11.02.09 17:32) [31]
Точно! да, "слона-то я и не заметил" :) бросаю..
-
-
Спасибо, это вообще очень помогает :)
-
> SNAPSHOT TABLE STABILITY (константа consistency) - изолированность > образа (воспроизводимое чтение), при обращении к таблицам > блокирует к ним доступ (как минимум на изменения, целиком > для всей таблицы, см. дальше резервирование таблиц). >
по-моему, где-то рядом
-
> Виталий Панасенко (12.02.09 11:15) [35]
манипулирование уровнями мне не подходит
> Сергей М.
Спасибо еще раз за статью, кажется в моем случае подойдет идея "глотания бильярдного шара с холостыми update-ами" :)
Всех благодарю за внимание!
|