8.3 Работа с блокировкой
X DevAPI поддерживает блокировку MySQL через методы lockShared() и lockExclusive() для методов Collection.find() и Table.select(). Это позволяет контролировать блокировку строк для обеспечения безопасных транзакционных обновлений документов в коллекциях и для предотвращения проблем с одновременным доступом, например, при использовании метода modify(). В этом разделе описывается, как использовать методы lockShared() и lockExclusive() для методов Collection.find() и Table.select(). Для получения дополнительной информации о блокировке см. .
Методы lockShared() и lockExclusive() обладают следующими свойствами, независимо от того, используются ли они с коллекцией или таблицей.
Разрешены многократные вызовы методов блокировки. Если оператор блокировки выполняется, в то время как другая транзакция удерживает ту же блокировку, он приостанавливается до тех пор, пока другая транзакция не освободит ее. Если выполняются несколько вызовов методов блокировки, приоритет имеет последний вызов метода блокировки. Другими словами,
find().lockShared().lockExclusive()эквивалентноfind().lockExclusive().lockShared()имеет ту же семантику, что и . Устанавливает общую блокировку на любые строки, которые читаются. Другие сессии могут читать строки, но не могут их изменять до тех пор, пока ваша транзакция не будет подтверждена. Если какие-либо из этих строк были изменены другой транзакцией, которая еще не была подтверждена, ваш запрос ожидает завершения этой транзакции, а затем использует последние значения.lockExclusive()имеет ту же семантику, что и . Для любой записи индекса, с которой встречается поиск, строки и все связанные записи индекса блокируются так же, как если бы вы выдали оператор для этих строк. Другие транзакции блокируются от обновления этих строк, от или от чтения данных в определенных уровнях изоляции транзакций. Согласованные чтения игнорируют любые блокировки, установленные на записи, которые существуют в представлении чтения. Старые версии записи заблокировать нельзя; они восстанавливаются путем применения журналов отмены к кэшированной копии записи.Блокировки удерживаются до тех пор, пока существует транзакция, в которой они были получены. Они немедленно освобождаются после завершения оператора, если не открыта транзакция или не выключен режим автоматического подтверждения.
Оба метода блокировки поддерживают режимы блокировки NOWAIT и SKIP LOCKED. Для получения дополнительной информации см. . Для использования этих режимов блокировки с методами блокировки передайте одно из следующих значений:
NOWAIT- если функция встречает блокировку строки, она прерывается и генерирует ошибкуER_LOCK_NOWAITSKIP_LOCKED- если функция встречает блокировку строки, она пропускает строку и продолжает выполнениеDEFAULT- если функция встречает блокировку строки, она ждет, пока блокировка не исчезнет. Эквивалентно вызову метода блокировки без режима.
Учет блокировок
При работе с режимами блокировки обратите внимание на следующее:
режим означает, что всегда открыта транзакция, которая автоматически подтверждается при выполнении оператора SQL.
По умолчанию сессии находятся в режиме автоматического подтверждения.
Вы отключаете режим автоматического подтверждения неявным образом при вызове
startTransaction().В режиме автоматического подтверждения, если блокировка получена, она освобождается после завершения оператора. Это может привести к выводу, что блокировки не были получены, но это не так.
Аналогично, если вы пытаетесь получить блокировку, которая уже принадлежит кому-то другому, оператор приостанавливается до тех пор, пока другая блокировка не будет освобождена.
© 2025 Oracle
Licensed under the GPLv2 License.