Транзакции в Firebird (Interbase), блокировка.

mot

Новичок
Транзакции в Firebird (Interbase), блокировка.

Абстрактно задача:
1. Выбрать из таблицы значение, удовлетворяющее некоему условию (условие, в зависимости от параметров, переданных скрипту, меняется).
2. Записать в переменную, проделать с переменной некоторые операции (фиксированы).
3. Создать в таблице новую запись, содержащую эту переменную.

Всё в пределах одной транзакции.

Нельзя допустить, чтобы скрипты запущенные с одними и теми же параметрами одновременно (почти одновременно), выбрали одно и тоже значение и соответственно записали в бд одинаковое значение.

В моём понимании, таблица в момент работы данной транзакции должна блокироватьcя на чтение. Остальные транзакции - ждать.

Конкретный код:
PHP:
$rDbc = ibase_connect($db_host, $db_login, $db_pass);

$rTDbc = ibase_trans($rDbc);

$sQuery = "select max(col1) from table1 where __условие__";
$rRes = ibase_query($rTDbc, $sQuery);
list($iNum) = ibase_fetch_row($rRes);

/*операции c $iNum, упрощённо*/
$iNum += 10;

$iNewId = ibase_gen_id('table1_id_gen');
$iNewNum = $iNum;

$query = "insert into table1 (id, col1) values ($iNewId, $iNewNum)";
ibase_query($rTDbc, $query);

ibase_commit($rTDbc);
Мануал был прочитан в первую очередь, в лице первого параметра для ibase_trans() сначала осмысленно подставлялись различные флаги, потом все подряд - не помогло.

Использовать генераторы или триггеры в данной ситуации совсем не удобно, т.к. различных условий выборки достаточно много.

-~{}~ 16.03.06 14:32:

Ошибся разделом форума, модераторы, перенесите пожалуйста..

-~{}~ 24.03.06 13:56:

Господа, если вопрос очень глупый - укажите пожалуйста что конкретно прочитать.
Если нет - дайте совет.

-~{}~ 10.04.06 14:36:

Проблема не решена...
 

slego

Новичок
Re: Транзакции в Firebird (Interbase), блокировка.

Я не то, чтобы диггер :), но вдруг это все еще актуально. Сам искал оооочень долго, пока не наткнулся на более-менее вразумительный механизм блокировки таблиц/записей в interbase/firebird.
Возможно, будет полезной эта информация

http://www.delphikingdom.com/asp/answer.asp?IDAnswer=44157
 

Ganer

Новичок
ненужно блокировать всю таблицу, достаточно блокировать записи попавшие в выборку. не знаю синтаксис интербейза, в оракле первый селект выглядед бы так
select max(col1) from table1 where __условие__ for update;

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

slego

Новичок
Автор оригинала: Ganer
...не знаю синтаксис интербейза...
собственно, именно этот момент принципиален. КАК объяснить Firebird'у на понятному ЕМУ языке, что ты хочешь заблокировать запись. А не момент с "теорией" и "принципами" блокировки записей вообще.
 
Сверху