Будет ли Oracle блокировать всю таблицу при выполнении оператора DML или только строку

Когда я пытаюсь что-то вставить/обновить в таблицу БД, будет ли Oracle блокировать всю таблицу или только вставляемую/обновляемую строку?

Это что-то, чем можно управлять через внешнюю конфигурацию?


person Victor    schedule 02.08.2013    source источник


Ответы (4)


Мы можем создавать блокировки явно с помощью команды LOCK TABLE. Подробнее

В противном случае вставка не блокирует никакие другие строки. Из-за модели изоляции чтения Oracle эта строка существует в нашем сеансе только до тех пор, пока мы ее не зафиксируем, поэтому никто другой не может с ней ничего сделать. Подробнее.

Оператор обновления блокирует только затронутые строки. Если только мы не внедрили пессимистическую стратегию блокировки с помощью SELECT... FOR UPDATE. Подробнее.

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

Это поведение встроено в ядро ​​Oracle и не настраивается.


Джастин хорошо заметил блокировку DDL на уровне таблицы. Эта блокировка приведет к тому, что сеанс, выполняющий DDL для таблицы, будет ждать, пока сеанс DML не зафиксируется, если только DDL не является чем-то вроде CREATE INDEX, и в этом случае он немедленно завершится ошибкой с ORA-00054.

person APC    schedule 02.08.2013

Это зависит от того, что вы подразумеваете под «замком».

Для 99,9% того, что может интересовать людей, Oracle будет получать блокировку на уровне строки при изменении строки. Блокировка на уровне строки по-прежнему позволяет считывателям читать строку (из-за согласованности чтения с несколькими версиями писатели никогда не блокируют считыватели, а читатели никогда не выполняют грязное чтение).

Если вы покопаетесь в v$lock, вы увидите, что обновление строки также снимает блокировку таблицы. Но эта блокировка только не позволяет другому сеансу выполнять DDL для таблицы. Поскольку вы практически никогда не захотите выполнять DDL для активной таблицы, это, как правило, не является чем-то, что на самом деле заставит другой сеанс ожидать блокировки.

person Justin Cave    schedule 02.08.2013

Когда выполняется обычный DML (UPDATE/DELETE/INSERT,MERGE и SELECT... FOR UPDATE), оракул получает 2 блокировки. Блокировка уровня строки (TX) — блокировка конкретной затронутой строки, и любая другая транзакция, пытающаяся изменить ту же строку, блокируется до тех пор, пока не завершится транзакция, которой она уже принадлежит. Блокировка уровня таблицы (TM) — при получении блокировки строки (TX) также получается дополнительная блокировка таблицы, чтобы предотвратить выполнение любых операций DDL во время выполнения DML.

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

Эксклюзивная блокировка строки (RX), также называемая субэксклюзивной блокировкой таблицы (SX), указывает, что транзакция, удерживающая блокировку, обновила строки таблицы или выдала SELECT ... FOR UPDATE. Блокировка SX позволяет другим транзакциям одновременно запрашивать, вставлять, обновлять, удалять или блокировать строки в той же таблице. Таким образом, блокировки SX позволяют нескольким транзакциям получить одновременные блокировки SX и SS для одной и той же таблицы.

Блокировка общей таблицы (S), удерживаемая одной транзакцией, позволяет другим транзакциям запрашивать таблицу (без использования SELECT ... FOR UPDATE), но разрешает обновления, только если одна транзакция удерживает блокировку общей таблицы. Несколько транзакций могут одновременно удерживать блокировку таблицы общего доступа, поэтому удержания этой блокировки недостаточно, чтобы гарантировать, что транзакция может изменить таблицу.

Блокировка таблицы с эксклюзивным доступом к общей строке (SRX), также называемая блокировкой субэксклюзивной таблицы с общим доступом (SSX), накладывает более строгие ограничения, чем блокировка общей таблицы. Только одна транзакция за раз может получить блокировку SSX для данной таблицы. Блокировка SSX, удерживаемая транзакцией, позволяет другим транзакциям запрашивать таблицу (кроме SELECT ... FOR UPDATE), но не обновлять таблицу.

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

person Sumit Sengar    schedule 28.04.2014
comment
Это дословная копия документации по Oracle. . Нужно хотя бы указывать первоисточник и цитировать. - person Kshitiz Sharma; 05.06.2016

Вам, вероятно, следует прочитать руководство по концепциям оракула относительно блокировки. Для стандартных операций DML (вставка, обновление, удаление, слияние) Oracle использует общую блокировку DML (тип TM). Это позволяет одновременно выполнять другие DML в таблице (это блокировка общего доступа). Строки, измененные операцией обновления или удаления DML и еще не зафиксированные, будут иметь эксклюзивную блокировку строк (тип TX). Другая операция DML в другом сеансе/транзакции может работать с таблицей, но если она изменяет ту же строку, она будет заблокирована до тех пор, пока держатель блокировки строки не освободит ее путем фиксации или отката.

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

person orcl_slave    schedule 31.10.2013