LOCK
LOCK â заблокиÑоваÑÑ ÑаблиÑÑ
СинÑакÑиÑ
LOCK [ TABLE ] [ ONLY ]имÑ[ * ] [, ...] [ INÑежим_блокиÑовкиMODE ] [ NOWAIT ] ÐдеÑежим_блокиÑÐ¾Ð²ÐºÐ¸Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑледÑÑÑим: ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE
ÐпиÑание
LOCK TABLE полÑÑÐ°ÐµÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð½Ð° ÑÑовне ÑаблиÑÑ, пÑи необÑ
одимоÑÑи Ð¾Ð¶Ð¸Ð´Ð°Ñ Ð¾ÑÐ²Ð¾Ð±Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ ÑаблиÑÑ Ð¾Ñ Ð´ÑÑгиÑ
конÑликÑÑÑÑиÑ
блокиÑовок. ÐÑли Ñказано NOWAIT, LOCK TABLE не ждÑÑ, пока ÑаблиÑа оÑвободиÑÑÑ: еÑли блокиÑÐ¾Ð²ÐºÑ Ð½ÐµÐ»ÑÐ·Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð½ÐµÐ¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾, команда пÑеÑÑваеÑÑÑ Ð¸ вÑдаÑÑÑÑ Ð¾Ñибка. Ðак ÑолÑко блокиÑовка полÑÑена, она ÑдеÑживаеÑÑÑ Ð´Ð¾ завеÑÑÐµÐ½Ð¸Ñ ÑекÑÑей ÑÑанзакÑии. (ÐÐ¾Ð¼Ð°Ð½Ð´Ñ UNLOCK TABLE не ÑÑÑеÑÑвÑеÑ; блокиÑовки вÑегда оÑвобождаÑÑÑÑ Ð² конÑе ÑÑанзакÑии.)
Ðогда блокиÑÑеÑÑÑ Ð¿ÑедÑÑавление, блокиÑовка Ñ Ñем же Ñежимом ÑекÑÑÑивно ÑаÑпÑеделÑеÑÑÑ Ð½Ð° вÑе оÑноÑениÑ, ÑигÑÑиÑÑÑÑие в опÑеделÑÑÑем пÑедÑÑавление запÑоÑе.
ÐапÑаÑÐ¸Ð²Ð°Ñ Ð°Ð²ÑомаÑиÑеÑкие блокиÑовки Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´, ÑабоÑаÑÑиÑ
Ñ ÑаблиÑами, Postgres Pro вÑегда вÑбиÑÐ°ÐµÑ Ð½Ð°Ð¸Ð¼ÐµÐ½ÐµÐµ огÑаниÑиваÑÑий Ñежим блокиÑовки из возможнÑÑ
. ÐпеÑаÑÐ¾Ñ LOCK TABLE пÑедназнаÑен Ð´Ð»Ñ ÑлÑÑаев, когда ÑÑебÑеÑÑÑ Ð±Ð¾Ð»ÐµÐµ ÑилÑÐ½Ð°Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовка. ÐапÑимеÑ, пÑедположим, ÑÑо пÑиложение вÑполнÑÐµÑ ÑÑанзакÑÐ¸Ñ Ð½Ð° ÑÑовне изолÑÑии READ COMMITTED и оно должно полÑÑаÑÑ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ñе даннÑе на пÑоÑÑжении вÑей ÑÑанзакÑии. ÐÐ»Ñ Ð´Ð¾ÑÑÐ¸Ð¶ÐµÐ½Ð¸Ñ ÑÑой Ñели можно полÑÑиÑÑ Ð´Ð»Ñ ÑаблиÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð² Ñежиме SHARE, пÑежде Ñем обÑаÑаÑÑÑÑ Ðº ней. Ð ÑезÑлÑÑаÑе паÑаллелÑнÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
бÑдÑÑ Ð¸ÑклÑÑÐµÐ½Ñ Ð¸ пÑи поÑледÑÑÑиÑ
ÑÑениÑÑ
бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑено ÑÑабилÑное пÑедÑÑавление заÑикÑиÑованнÑÑ
даннÑÑ
, Ñак как Ñежим блокиÑовки SHARE конÑликÑÑÐµÑ Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовкой ROW EXCLUSIVE, запÑаÑиваемой пÑи запиÑи, а LOCK TABLE бÑÐ´ÐµÑ Ð¶Ð´Ð°ÑÑ, пока паÑаллелÑнÑе ÑÑанзакÑии Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовкой Ð¸Ð¼Ñ IN SHARE MODEROW EXCLUSIVE не бÑдÑÑ Ð·Ð°ÑикÑиÑÐ¾Ð²Ð°Ð½Ñ Ð¸Ð»Ð¸ оÑмененÑ. Таким обÑазом, в Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ñакой блокиÑовки не оÑÑанеÑÑÑ Ð½Ð¸ одной оÑкÑÑÑой незаÑикÑиÑованной опеÑаÑии запиÑи; кÑоме Ñого, никÑо не ÑÐ¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¿Ð¸ÑÑваÑÑ Ð² ÑаблиÑÑ, пока блокиÑовка не бÑÐ´ÐµÑ ÑнÑÑа.
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¿Ð¾Ñ
ожий ÑÑÑÐµÐºÑ Ð² ÑÑанзакÑии на ÑÑовне изолÑÑии REPEATABLE READ или SERIALIZABLE, необÑ
одимо вÑполниÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ LOCK TABLE пеÑед пеÑвÑм SELECT или опеÑаÑоÑом, изменÑÑÑим даннÑе. ÐÑедÑÑавление даннÑÑ
Ð´Ð»Ñ ÑÑанзакÑии ÑÑÐ¾Ð²Ð½Ñ REPEATABLE READ или SERIALIZABLE бÑÐ´ÐµÑ Ð·Ð°Ð¼Ð¾Ñожено в моменÑ, когда наÑнÑÑ Ð²ÑполнÑÑÑÑÑ ÑÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑ. ÐÑли команда LOCK TABLE вÑполнÑеÑÑÑ Ð² ÑÑанзакÑии позже, она Ñак же иÑклÑÑÐ°ÐµÑ Ð¿Ð°ÑаллелÑнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ, но не даÑÑ Ð³Ð°ÑанÑии, ÑÑо ÑÑанзакÑÐ¸Ñ Ð±ÑÐ´ÐµÑ ÑиÑаÑÑ Ð¿Ð¾Ñледние заÑикÑиÑованнÑе даннÑе.
ÐÑли в ÑÑанзакÑии Ñакого Ñода ÑÑебÑеÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ Ð´Ð°Ð½Ð½Ñе в ÑаблиÑе, Ð´Ð»Ñ Ð½ÐµÑ ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Ñежим блокиÑовки SHARE ROW EXCLUSIVE вмеÑÑо SHARE. ÐÑÐ¾Ñ Ñежим гаÑанÑиÑÑеÑ, ÑÑо в один Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñемени бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ ÑолÑко одна ÑÑанзакÑÐ¸Ñ Ñакого Ñипа. Ðез ÑÑого огÑаниÑÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð° взаимоблокиÑовка: две ÑÑанзакÑии могÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно полÑÑиÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки SHARE, поÑле Ñего они не ÑмогÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ ROW EXCLUSIVE, ÑÑÐ¾Ð±Ñ ÑобÑÑвенно вÑполниÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ. (ÐамеÑÑÑе, ÑÑо ÑобÑÑвеннÑе блокиÑовки ÑÑанзакÑии никогда не конÑликÑÑÑÑ, Ñак ÑÑо ÑÑанзакÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ ROW EXCLUSIVE, когда она Ð²Ð»Ð°Ð´ÐµÐµÑ Ð±Ð»Ð¾ÐºÐ¸Ñовкой SHARE â но не Ñогда, когда блокиÑÐ¾Ð²ÐºÑ SHARE ÑдеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð´ÑÑÐ³Ð°Ñ ÑÑанзакÑиÑ.) ЧÑÐ¾Ð±Ñ Ð½Ðµ допÑÑÑиÑÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð±Ð»Ð¾ÐºÐ¸Ñовок, ÑбедиÑеÑÑ, ÑÑо вÑе ÑÑанзакÑии запÑаÑиваÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки одниÑ
обÑекÑов в одинаковом поÑÑдке, и еÑли Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ обÑекÑа запÑаÑиваÑÑÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки в ÑазнÑÑ
ÑежимаÑ
, ÑÑанзакÑии вÑегда Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð°Ð¿ÑаÑиваÑÑ ÑамÑÑ ÑÑÑогÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑовкÑ.
ÐополниÑелÑно о ÑÐµÐ¶Ð¸Ð¼Ð°Ñ Ð¸ ÑÑÑаÑегиÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки можно ÑзнаÑÑ Ð² Разделе 13.3.
ÐаÑамеÑÑÑ
имÑÐÐ¼Ñ (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹) ÑÑÑеÑÑвÑÑÑей ÑаблиÑÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑой запÑаÑиваеÑÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовка. ÐÑли пеÑед именем ÑаблиÑÑ Ñказано
ONLY, блокиÑÑеÑÑÑ ÑолÑко Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ ÑаблиÑа. ÐезONLYблокиÑÑеÑÑÑ Ð¸ Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ ÑаблиÑа, и вÑе ÐµÑ Ð¿Ð¾Ñомки (еÑли ÑаковÑе еÑÑÑ). ÐоÑле имени ÑаблиÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ Ñакже добавиÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑное Ñказание*, ÑÑÐ¾Ð±Ñ Ñвно обознаÑиÑÑ, ÑÑо блокиÑовка заÑÑÐ°Ð³Ð¸Ð²Ð°ÐµÑ Ð¸ вÑе доÑеÑние ÑаблиÑÑ.Ðоманда
LOCK TABLE a, b;ÑавнознаÑна поÑледоваÑелÑноÑÑиLOCK TABLE a; LOCK TABLE b;. ТаблиÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÑÑÑÑÑ Ð¿Ð¾ одной в поÑÑдке, заданном в командеLOCK TABLE.Ñежим_блокиÑовкиРежим блокиÑовки опÑеделÑеÑ, Ñ ÐºÐ°ÐºÐ¾Ð¹ блокиÑовкой бÑÐ´ÐµÑ ÐºÐ¾Ð½ÑликÑоваÑÑ Ð´Ð°Ð½Ð½Ð°Ñ. Ð ÐµÐ¶Ð¸Ð¼Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовок опиÑÐ°Ð½Ñ Ð² Разделе 13.3.
ÐÑли Ñежим блокиÑовки не Ñказан, пÑименÑеÑÑÑ ÑамÑй ÑÑÑогий Ñежим,
ACCESS EXCLUSIVE.NOWAITУказÑваеÑ, ÑÑо
LOCK TABLEне должна ожидаÑÑ Ð¾ÑÐ²Ð¾Ð±Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑликÑÑÑÑÐ¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовок: еÑли запÑоÑÐµÐ½Ð½Ð°Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовка не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÑÑена немедленно, ÑÑанзакÑÐ¸Ñ Ð¿ÑеÑÑваеÑÑÑ.
ÐÑимеÑаниÑ
LOCK TABLE ... IN ACCESS SHARE MODE ÑÑебÑÐµÑ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ Ð¿Ñава SELECT в Ñелевой ÑаблиÑе. LOCK TABLE ... IN ROW EXCLUSIVE MODE ÑÑебÑÐµÑ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ Ð¿Ñав INSERT, UPDATE, DELETE или TRUNCATE Ð´Ð»Ñ Ñелевой ÑаблиÑÑ. ÐÑе дÑÑгие ÑоÑÐ¼Ñ LOCK ÑÑебÑÑÑ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ Ð¿Ñава UPDATE, DELETE или TRUNCATE на ÑÑовне ÑаблиÑÑ.
ÐолÑзоваÑелÑ, вÑполнÑÑÑий опеÑаÑÐ¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки пÑедÑÑавлениÑ, должен имеÑÑ ÑооÑвеÑÑÑвÑÑÑее пÑаво Ð´Ð»Ñ ÑÑого пÑедÑÑавлениÑ. ÐÑоме Ñого, Ð²Ð»Ð°Ð´ÐµÐ»ÐµÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ имеÑÑ ÑопÑÑÑÑвÑÑÑие пÑава в нижележаÑÐ¸Ñ Ð±Ð°Ð·Ð¾Ð²ÑÑ Ð¾ÑноÑениÑÑ , Ñ Ð¾ÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ, ÑÑÑанавливаÑÑий блокиÑовкÑ, Ð¼Ð¾Ð¶ÐµÑ ÑÑÐ¸Ñ Ð¿Ñав не имеÑÑ.
Ðне блока ÑÑанзакÑии команда LOCK TABLE беÑполезна: блокиÑовка ÑоÑ
ÑаниÑÑÑ ÑолÑко до завеÑÑÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑии. ÐоÑÑÐ¾Ð¼Ñ Postgres Pro вÑдаÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð¿Ñи попÑÑке пÑимениÑÑ LOCK не в блоке ÑÑанзакÑии. ЧÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ Ð±Ð»Ð¾Ðº ÑÑанзакÑии, иÑполÑзÑйÑе BEGIN и COMMIT (или ROLLBACK).
LOCK TABLE Ð¼Ð¾Ð¶ÐµÑ ÑÑÑанавливаÑÑ ÑолÑко блокиÑовки на ÑÑовне ÑаблиÑÑ, Ñак ÑÑо вÑе имена Ñежимов, вклÑÑаÑÑие Ñлово ROW (ÑÑÑока), не ÑовÑем коÑÑекÑнÑ. СледÑÐµÑ Ð²Ð¾ÑпÑинимаÑÑ Ð¸Ñ
Ñак, ÑÑо в ÑÑиÑ
ÑежимаÑ
полÑзоваÑÐµÐ»Ñ Ð½Ð°Ð¼ÐµÑеваеÑÑÑ Ð¿Ð¾Ð»ÑÑаÑÑ Ð² заблокиÑованной ÑаблиÑе блокиÑовки ÑÑÐ¾Ð²Ð½Ñ ÑÑÑок. Также ÑÑÑиÑе, ÑÑо в Ñежиме ROW EXCLUSIVE ÑÑÑанавливаеÑÑÑ ÑазделÑÐµÐ¼Ð°Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовка ÑаблиÑÑ. ÐамеÑÑÑе, ÑÑо пÑимениÑелÑно к LOCK TABLE вÑе ÑÐµÐ¶Ð¸Ð¼Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки дейÑÑвÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾, оÑлиÑаÑÑÑÑ ÑолÑко пÑавила, опÑеделÑÑÑие, какой Ñежим Ñ ÐºÐ°ÐºÐ¸Ð¼ конÑликÑÑеÑ. ЧÑÐ¾Ð±Ñ ÑзнаÑÑ, как полÑÑиÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ на ÑÑовне ÑÑÑок, обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 13.3.2 и ÐÑедложение блокиÑовки в ÑпÑавоÑной докÑменÑаÑии SELECT.
ÐÑимеÑÑ
ÐолÑÑение блокиÑовки SHARE Ð´Ð»Ñ Ð¿ÐµÑвиÑного клÑÑа ÑаблиÑÑ Ð¿Ñи добавлении запиÑи в подÑинÑннÑÑ ÑаблиÑÑ:
BEGIN WORK;
LOCK TABLE films IN SHARE MODE;
SELECT id FROM films
WHERE name = 'Star Wars: Episode I - The Phantom Menace';
-- ÐÑли запиÑÑ Ð½Ðµ бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑена, пÑоизойдÑÑ Ð¾ÑÐºÐ°Ñ ÑÑанзакÑии
INSERT INTO films_user_comments VALUES
(_id_, 'GREAT! I was waiting for it for so long!');
COMMIT WORK;УÑÑановление блокиÑовки SHARE ROW EXCLUSIVE в ÑаблиÑе пеÑвиÑного клÑÑа пеÑед вÑполнением опеÑаÑии ÑдалениÑ:
BEGIN WORK;
LOCK TABLE films IN SHARE ROW EXCLUSIVE MODE;
DELETE FROM films_user_comments WHERE id IN
(SELECT id FROM films WHERE rating < 5);
DELETE FROM films WHERE rating < 5;
COMMIT WORK;СовмеÑÑимоÑÑÑ
Ðоманда LOCK TABLE оÑÑÑÑÑÑвÑÐµÑ Ð² ÑÑандаÑÑе SQL, в нÑм ÑÑовни изолÑÑии ÑÑанзакÑии опÑеделÑÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ SET TRANSACTION. Postgres Pro поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¸ ÑÑÐ¾Ñ Ð²Ð°ÑианÑ; подÑобнее ÑÑо опиÑано в SET TRANSACTION.
Ðа иÑклÑÑением ACCESS SHARE, ACCESS EXCLUSIVE и SHARE UPDATE EXCLUSIVE, ÑÐµÐ¶Ð¸Ð¼Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки в Postgres Pro и ÑинÑакÑÐ¸Ñ LOCK TABLE ÑовмеÑÑÐ¸Ð¼Ñ Ñ Ñеми, ÑÑо пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð² СУÐÐ Oracle.