mot
Новичок
Транзакции в Firebird (Interbase), блокировка.
Абстрактно задача:
1. Выбрать из таблицы значение, удовлетворяющее некоему условию (условие, в зависимости от параметров, переданных скрипту, меняется).
2. Записать в переменную, проделать с переменной некоторые операции (фиксированы).
3. Создать в таблице новую запись, содержащую эту переменную.
Всё в пределах одной транзакции.
Нельзя допустить, чтобы скрипты запущенные с одними и теми же параметрами одновременно (почти одновременно), выбрали одно и тоже значение и соответственно записали в бд одинаковое значение.
В моём понимании, таблица в момент работы данной транзакции должна блокироватьcя на чтение. Остальные транзакции - ждать.
Конкретный код:
Мануал был прочитан в первую очередь, в лице первого параметра для ibase_trans() сначала осмысленно подставлялись различные флаги, потом все подряд - не помогло.
Использовать генераторы или триггеры в данной ситуации совсем не удобно, т.к. различных условий выборки достаточно много.
-~{}~ 16.03.06 14:32:
Ошибся разделом форума, модераторы, перенесите пожалуйста..
-~{}~ 24.03.06 13:56:
Господа, если вопрос очень глупый - укажите пожалуйста что конкретно прочитать.
Если нет - дайте совет.
-~{}~ 10.04.06 14:36:
Проблема не решена...
Абстрактно задача:
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);
Использовать генераторы или триггеры в данной ситуации совсем не удобно, т.к. различных условий выборки достаточно много.
-~{}~ 16.03.06 14:32:
Ошибся разделом форума, модераторы, перенесите пожалуйста..
-~{}~ 24.03.06 13:56:
Господа, если вопрос очень глупый - укажите пожалуйста что конкретно прочитать.
Если нет - дайте совет.
-~{}~ 10.04.06 14:36:
Проблема не решена...