проверить наличие данных в формах оракула/оракула для нескольких пользователей

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

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

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

Как я могу контролировать существование элемента, когда несколько пользователей делают запросы одновременно?

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


person Victor Suarez    schedule 24.09.2014    source источник


Ответы (1)


Я не уверен, что это действительно ответ на ваш вопрос, поскольку я никогда не использовал Oracle Form. Но, вообще говоря, чтобы столкнуться с такой проблемой, вы должны использовать атомарный тест и задать запросы. Звучит страшно, не так ли? А на самом деле просто:

Скажем, в определенный момент один из ваших пользователей увидел этот инвентарь:

SELECT * FROM INVENTORY WHERE PRODUCT='LEMON';
ID  PRODUCT QTY
2   LEMON   200

На момент запроса SELECT на складе было 200 лимонов. Но, возможно, они уже распроданы. Может быть. Возможно, нет.

Если пользователь, увидев 200 лимонов, решит проверить, скажем, 100 из них. Вы можете сделать это только в том случае, если на момент UPDATE осталось 100 или более лимонов . Конкретно вы напишете:

UPDATE INVENTORY 
  SET QTY=QTY-100 
  WHERE PRODUCT='LEMON' AND QTY >= 100;

Таким образом, вы обновляете свою таблицу только в том случае, если в это время осталось достаточно лимона. Поскольку Oracle гарантирует, что только одна инструкция может обновлять строку за раз, все одновременные запросы на обновление этой строки обрабатываются последовательно. Кроме того, при использовании WHERE ... QTY >= 100 Oracle проверит количество предметов, оставшихся в UPDATE времени.

Вы должны быть готовы (и вы должны проверить!) результат оператора, чтобы увидеть, была ли обновлена ​​одна строка или нет. Если ни одна строка не была обновлена, это означает, что на момент обновления на складе уже не было достаточного количества лимонов.

person Sylvain Leroux    schedule 24.09.2014