Есть ли способ выбрать записи из Oracle и заблокировать их, чтобы избежать чтения другим запросом? - PullRequest
0 голосов
/ 29 марта 2019

У меня есть веб-сервис на основе Java (REST API), который должен читать записи из таблицы в БД Oracle. Существует вероятность того, что 2 запроса могут быть запущены к этому API одновременно, что приводит к тому, что обе заявки для обработки выбирают одинаковые записи.

Как избежать этой проблемы? Oracle позволяет только выбирать, и я не знаю, как мы можем эффективно блокировать записи?

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

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

Если вам нужно выполнить несколько операторов выбора для таблицы, и вы 'Опасаясь, что он будет изменен между двумя операторами, вы можете сделать ALTER SESSION SET TRANSACTION READ ONLY, чтобы получить согласованность чтения на уровне транзакций .Вам не нужно ничего блокировать.

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

https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10005.htm#SQLRF01705

0 голосов
/ 29 марта 2019

Взгляните на предложение SELECT ... FOR UPDATE .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...