Как я могу вставить запись и заблокировать эту строку одновременно? - PullRequest
4 голосов
/ 19 июля 2010

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

Как я могу гарантировать, что никто другой не получит блокировку этой новой записи, прежде чем у меня появится возможность SELECT...FOR UPDATE ее?

Использование Oracle 10g.

Ответы [ 2 ]

10 голосов
/ 19 июля 2010

Нет, вы никогда не сможете поддерживать блокировку между транзакциями.Вопрос, который вы должны задать себе, заключается в том, почему вам нужно выполнить коммит между insert и select ... for update.Строка заблокирована insert;если вы закончите все, что вы делаете с этой строкой, прежде чем совершить фиксацию, вам не нужно беспокоиться о повторной блокировке строки.

2 голосов
/ 20 июля 2010

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

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

  1. Добавить флаг в таблицу, например, VISIBLE, по умолчанию 'N'.

  2. При вставке строки, вставьте его со значением по умолчанию.

  3. После фиксации select it for update и обновите флаг до 'Y' (чтобы при повторной фиксации кода во второй раз), он также обновит флаг).

  4. Измените ваше приложение так, чтобы другие сеансы игнорировали строки, где VISIBLE='N'.

...