13.3. ЯвнÑе блокиÑовки
ÐÐ»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°ÑаллелÑнÑм доÑÑÑпом к даннÑм в ÑаблиÑаÑ
Postgres Pro пÑедоÑÑавлÑÐµÑ Ð½ÐµÑколÑко Ñежимов ÑвнÑÑ
блокиÑовок. ÐÑи ÑÐµÐ¶Ð¸Ð¼Ñ Ð¼Ð¾Ð³ÑÑ Ð¿ÑименÑÑÑÑÑ Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки даннÑÑ
Ñо ÑÑоÑÐ¾Ð½Ñ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² ÑиÑÑаÑиÑÑ
, когда MVCC не даÑÑ Ð¶ÐµÐ»Ð°ÐµÐ¼Ñй ÑезÑлÑÑаÑ. ÐÑоме Ñого, болÑÑинÑÑво команд Postgres Pro авÑомаÑиÑеÑки полÑÑаÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки ÑооÑвеÑÑÑвÑÑÑиÑ
Ñежимов, заÑиÑаÑÑие Ð¾Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð°Ð´ÐµÐ¹ÑÑвованнÑÑ
ÑаблиÑ, неÑовмеÑÑимого Ñ Ñ
аÑакÑеÑом вÑполнÑемой командÑ. (ÐапÑимеÑ, TRUNCATE не Ð¼Ð¾Ð¶ÐµÑ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñно вÑполнÑÑÑÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно Ñ Ð´ÑÑгими опеÑаÑиÑми Ñ ÑÑой ÑаблиÑей, Ñак ÑÑо во избежание конÑликÑа ÑÑа команда полÑÑÐ°ÐµÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ ACCESS EXCLUSIVE Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑаблиÑÑ.)
СпиÑок ÑекÑÑиÑ
акÑивнÑÑ
блокиÑовок на ÑеÑвеÑе можно полÑÑиÑÑ, пÑоÑиÑав ÑиÑÑемное пÑедÑÑавление pg_locks. Ðа дополниÑелÑнÑми ÑведениÑми о наблÑдении за ÑоÑÑоÑнием менеджеÑа блокиÑовок обÑаÑиÑеÑÑ Ðº Ðлаве 26.
13.3.1. ÐлокиÑовки на ÑÑовне ÑаблиÑÑ
РпÑиведÑнном ниже ÑпиÑке пеÑеÑиÑÐ»ÐµÐ½Ñ Ð¸Ð¼ÐµÑÑиеÑÑ ÑÐµÐ¶Ð¸Ð¼Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовок и конÑекÑÑÑ, где иÑ
авÑомаÑиÑеÑки пÑименÑÐµÑ Postgres Pro. ÐÑ Ð¼Ð¾Ð¶ÐµÑе Ñакже Ñвно запÑоÑиÑÑ Ð»ÑбÑÑ Ð¸Ð· ÑÑиÑ
блокиÑовок Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ LOCK. ÐомниÑе, ÑÑо вÑе ÑÑи ÑÐµÐ¶Ð¸Ð¼Ñ ÑабоÑаÑÑ Ð½Ð° ÑÑовне ÑаблиÑÑ, даже еÑли Ð¸Ð¼Ñ Ñежима ÑодеÑÐ¶Ð¸Ñ Ñлово «row»; Ñакие имена ÑложилиÑÑ Ð¸ÑÑоÑиÑеÑки. РнекоÑоÑой ÑÑепени ÑÑи имена оÑÑажаÑÑ ÑипиÑное пÑименение каждого Ñежима блокиÑовки, но ÑмÑÑл Ñ Ð²ÑеÑ
один. ÐдинÑÑвенное, ÑÑо дейÑÑвиÑелÑно оÑлиÑÐ°ÐµÑ Ð¾Ð´Ð¸Ð½ Ñежим блокиÑовки Ð¾Ñ Ð´ÑÑгого, ÑÑо Ð½Ð°Ð±Ð¾Ñ Ñежимов, Ñ ÐºÐ¾ÑоÑÑми конÑликÑÑÐµÑ ÐºÐ°Ð¶Ð´Ñй из ниÑ
(Ñм. ТаблиÑÑ 13.2). Ðве ÑÑанзакÑии не могÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно владеÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовками конÑликÑÑÑÑиÑ
Ñежимов Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ и Ñой же ÑаблиÑÑ. (Ðднако ÑÑÑиÑе, ÑÑо ÑÑанзакÑÐ¸Ñ Ð½Ð¸ÐºÐ¾Ð³Ð´Ð° не конÑликÑÑÐµÑ Ñ Ñобой. ÐапÑимеÑ, она Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¿ÑоÑиÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ ACCESS EXCLUSIVE, а заÑем ACCESS SHARE Ð´Ð»Ñ Ñой же ÑаблиÑÑ.) ÐÑи ÑÑом ÑазнÑе ÑÑанзакÑии Ñвободно могÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно владеÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовками неконÑликÑÑÑÑиÑ
Ñежимов. ÐамеÑÑÑе, ÑÑо некоÑоÑÑе ÑÐµÐ¶Ð¸Ð¼Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки конÑликÑÑÑÑ Ñами Ñ Ñобой (напÑимеÑ, блокиÑовкой ACCESS EXCLUSIVE в один Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñемени Ð¼Ð¾Ð¶ÐµÑ Ð²Ð»Ð°Ð´ÐµÑÑ ÑолÑко одна ÑÑанзакÑиÑ), а некоÑоÑÑе â Ð½ÐµÑ (напÑимеÑ, блокиÑÐ¾Ð²ÐºÑ ACCESS SHARE могÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ ÑÑÐ°Ð·Ñ Ð½ÐµÑколÑко ÑÑанзакÑий).
Ð ÐµÐ¶Ð¸Ð¼Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовок на ÑÑовне ÑаблиÑÑ
ACCESS SHARE(AccessShareLock)ÐонÑликÑÑÐµÑ ÑолÑко Ñ Ñежимом блокиÑовки
ACCESS EXCLUSIVE.Ðоманда
SELECTполÑÑÐ°ÐµÑ ÑакÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð´Ð»Ñ ÑаблиÑ, на коÑоÑÑе она ÑÑÑлаеÑÑÑ. ÐообÑе говоÑÑ, блокиÑÐ¾Ð²ÐºÑ Ð² ÑÑом Ñежиме полÑÑÐ°ÐµÑ Ð»Ñбой запÑоÑ, коÑоÑÑй ÑолÑко ÑиÑÐ°ÐµÑ ÑаблиÑÑ, но не менÑÐµÑ ÐµÑ Ð´Ð°Ð½Ð½Ñе.ROW SHARE(RowShareLock)ÐонÑликÑÑÐµÑ Ñ Ñежимами блокиÑовки
EXCLUSIVEиACCESS EXCLUSIVE.Ðоманда
SELECTÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð² ÑÑом Ñежиме Ð´Ð»Ñ Ð²ÑÐµÑ ÑаблиÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð¾ ÑказаниеFOR UPDATE,FOR NO KEY UPDATE,FOR SHAREилиFOR KEY SHARE(в дополнение к блокиÑовкамACCESS SHAREÐ´Ð»Ñ Ð»ÑбÑÑ Ð´ÑÑÐ³Ð¸Ñ ÑаблиÑ, задейÑÑвованнÑÑ Ð±ÐµÐ· ÐºÐ°ÐºÐ¸Ñ -либо ÑвнÑÑ Ñказаний блокиÑовкиFOR .. .).ROW EXCLUSIVE(RowExclusiveLock)ÐонÑликÑÑÐµÑ Ñ Ñежимами блокиÑовки
SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVEиACCESS EXCLUSIVE.ÐомандÑ
UPDATE,DELETE,INSERTиMERGEполÑÑаÑÑ ÑакÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð´Ð»Ñ Ñелевой ÑаблиÑÑ (в дополнение к блокиÑовкамACCESS SHAREÐ´Ð»Ñ Ð²ÑÐµÑ Ð´ÑÑÐ³Ð¸Ñ Ð·Ð°Ð´ÐµÐ¹ÑÑвованнÑÑ ÑаблиÑ). ÐообÑе говоÑÑ, блокиÑÐ¾Ð²ÐºÑ Ð² ÑÑом Ñежиме полÑÑÐ°ÐµÑ Ð»ÑÐ±Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°, коÑоÑÐ°Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÐµÑ Ð´Ð°Ð½Ð½Ñе в ÑаблиÑе.SHARE UPDATE EXCLUSIVE(ShareUpdateExclusiveLock)ÐонÑликÑÑÐµÑ Ñ Ñежимами блокиÑовки
SHARE UPDATE EXCLUSIVE,SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVEиACCESS EXCLUSIVE. ÐÑÐ¾Ñ Ñежим заÑиÑÐ°ÐµÑ ÑаблиÑÑ Ð¾Ñ Ð¿Ð°ÑаллелÑного Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑ ÐµÐ¼Ñ Ð¸ запÑÑка пÑоÑеÑÑаVACUUM.ÐапÑаÑиваеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼Ð¸
VACUUM(безFULL),ANALYZE,CREATE INDEX CONCURRENTLY,CREATE STATISTICS,COMMENT ON,REINDEX CONCURRENTLYи некоÑоÑÑми ÑоÑмамиALTER INDEXиALTER TABLE(за подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº опиÑÐ°Ð½Ð¸Ñ ÑÑÐ¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´).SHARE(ShareLock)ÐонÑликÑÑÐµÑ Ñ Ñежимами блокиÑовки
ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE ROW EXCLUSIVE,EXCLUSIVEиACCESS EXCLUSIVE. ÐÑÐ¾Ñ Ñежим заÑиÑÐ°ÐµÑ ÑаблиÑÑ Ð¾Ñ Ð¿Ð°ÑаллелÑного Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ .ÐапÑаÑиваеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹
CREATE INDEX(без паÑамеÑÑаCONCURRENTLY).SHARE ROW EXCLUSIVE(ShareRowExclusiveLock)ÐонÑликÑÑÐµÑ Ñ Ñежимами блокиÑовки
ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVEиACCESS EXCLUSIVE. ÐÑÐ¾Ñ Ñежим заÑиÑÐ°ÐµÑ ÑаблиÑÑ Ð¾Ñ Ð¿Ð°ÑаллелÑнÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ даннÑÑ Ð¸ пÑи ÑÑом он ÑвлÑеÑÑÑ ÑамоиÑклÑÑаÑÑим, Ñак ÑÑо ÑакÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ ÑолÑко один ÑеанÑ.ÐапÑаÑиваеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹
CREATE TRIGGERи некоÑоÑÑми ÑоÑмамиALTER TABLE).EXCLUSIVE(ExclusiveLock)ÐонÑликÑÑÐµÑ Ñ Ñежимами блокиÑовки
ROW SHARE,ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVEиACCESS EXCLUSIVE. ÐÑÐ¾Ñ Ñежим ÑовмеÑÑим ÑолÑко Ñ Ð±Ð»Ð¾ÐºÐ¸ÑовкойACCESS SHARE, Ñо еÑÑÑ Ð¿Ð°ÑаллелÑно Ñ ÑÑанзакÑией, полÑÑивÑей блокиÑÐ¾Ð²ÐºÑ Ð² ÑÑом Ñежиме, допÑÑкаеÑÑÑ ÑолÑко ÑÑение ÑаблиÑÑ.ÐапÑаÑиваеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹
REFRESH MATERIALIZED VIEW CONCURRENTLY.ACCESS EXCLUSIVE(AccessExclusiveLock)ÐонÑликÑÑÐµÑ Ñ Ñежимами блокиÑовок
ACCESS SHARE,ROW SHARE,ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVEиACCESS EXCLUSIVE. ÐÑÐ¾Ñ Ñежим гаÑанÑиÑÑеÑ, ÑÑо кÑоме ÑÑанзакÑии, полÑÑивÑей ÑÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑовкÑ, Ð½Ð¸ÐºÐ°ÐºÐ°Ñ Ð´ÑÑÐ³Ð°Ñ ÑÑанзакÑÐ¸Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº ÑаблиÑе каким-либо ÑпоÑобом.ÐапÑаÑиваеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼Ð¸
DROP TABLE,TRUNCATE,REINDEX,CLUSTER,VACUUM FULLиREFRESH MATERIALIZED VIEW(безCONCURRENTLY). ÐлокиÑÐ¾Ð²ÐºÑ Ð½Ð° ÑÑом ÑÑовне запÑаÑиваÑÑ Ñакже многие видÑALTER INDEXиALTER TABLE. Ð ÑÑом Ñежиме по ÑмолÑÐ°Ð½Ð¸Ñ Ð·Ð°Ð¿ÑаÑиваÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð¸ опеÑаÑоÑÑLOCK TABLE, еÑли Ñвно не вÑбÑан дÑÑгой Ñежим.
ÐодÑказка
ТолÑко блокиÑовка ACCESS EXCLUSIVE блокиÑÑÐµÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ SELECT (без FOR UPDATE/SHARE).
ÐÑоме Ñого, Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки ÑиÑÑÐµÐ¼Ñ 1С:ÐÑедпÑиÑÑие ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ ÐµÑÑ Ð´Ð²Ð° Ñежима блокиÑовок. ÐÑи ÑÐµÐ¶Ð¸Ð¼Ñ Ð½Ðµ конÑликÑÑÑÑ Ð½Ð¸ Ñ ÐºÐ°ÐºÐ¸Ð¼Ð¸ Ñежимами, опиÑаннÑми вÑÑе. ÐÑ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ, но лÑÑÑе вмеÑÑо Ð½Ð¸Ñ Ð¿ÑименÑÑÑ ÑекомендаÑелÑнÑе блокиÑовки, коÑоÑÑе пÑедоÑÑавлÑÑÑ ÑÑ Ð¶Ðµ ÑÑнкÑионалÑноÑÑÑ.
-
APPLICATION SHARE ÐонÑликÑÑÐµÑ ÑолÑко Ñ Ñежимом блокиÑовки
APPLICATION EXCLUSIVE.-
APPLICATION EXCLUSIVE ÐонÑликÑÑÐµÑ Ñ Ñежимами блокиÑовок
APPLICATION SHAREиAPPLICATION EXCLUSIVE.
ÐолÑÑÐµÐ½Ð½Ð°Ñ ÑÑанзакÑией блокиÑовка обÑÑно ÑоÑ
ÑанÑеÑÑÑ Ð´Ð¾ конÑа ÑÑанзакÑии. Ðо еÑли блокиÑовка полÑÑена поÑле ÑÑÑановки ÑоÑки ÑоÑ
ÑанениÑ, она оÑвобождаеÑÑÑ Ð½ÐµÐ¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾ в ÑлÑÑае оÑкаÑа к ÑÑой ÑоÑке. ÐÑо ÑоглаÑÑеÑÑÑ Ñ Ð¿ÑинÑипом дейÑÑÐ²Ð¸Ñ ROLLBACK â ÑÑа команда оÑменÑÐµÑ ÑÑÑекÑÑ Ð²ÑеÑ
команд поÑле ÑоÑки ÑоÑ
ÑанениÑ. То же ÑпÑаведливо и Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовок, полÑÑеннÑÑ
в блоке иÑклÑÑений PL/pgSQL: пÑи вÑÑ
оде из блока Ñ Ð¾Ñибкой Ñакие блокиÑовки оÑвобождаÑÑÑÑ.
ТаблиÑа 13.2. ÐонÑликÑÑÑÑие ÑÐµÐ¶Ð¸Ð¼Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки
| ÐапÑаÑиâваемÑй Ñежим блокиâÑовки | СÑÑеÑÑвÑÑÑий Ñежим блокиÑовки | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
ACCESS SHARE | ROW SHARE | ROW EXCL. | SHARE UPDATE EXCL. | SHARE | SHARE ROW EXCL. | EXCL. | ACCESS EXCL. | APP. SHARE | APP. EXCL. | |
ACCESS SHARE | Â | Â | Â | Â | Â | Â | Â | X | Â | Â |
ROW SHARE | Â | Â | Â | Â | Â | Â | X | X | Â | Â |
ROW EXCL. | Â | Â | Â | Â | X | X | X | X | Â | Â |
SHARE UPDATE EXCL. | Â | Â | Â | X | X | X | X | X | Â | Â |
SHARE | Â | Â | X | X | Â | X | X | X | Â | Â |
SHARE ROW EXCL. | Â | Â | X | X | X | X | X | X | Â | Â |
EXCL. | Â | X | X | X | X | X | X | X | Â | Â |
ACCESS EXCL. | X | X | X | X | X | X | X | X | Â | Â |
APP. SHARE | Â | Â | Â | Â | Â | Â | Â | Â | Â | X |
APP. EXCL. | Â | Â | Â | Â | Â | Â | Â | Â | X | X |
13.3.2. ÐлокиÑовки на ÑÑовне ÑÑÑок
Ðомимо блокиÑовок на ÑÑовне ÑаблиÑÑ, ÑÑÑеÑÑвÑÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки на ÑÑовне ÑÑÑок, пеÑеÑиÑленнÑе ниже Ñ ÐºÐ¾Ð½ÑекÑÑами, где Postgres Pro пÑименÑÐµÑ Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ. ÐолнÑй пеÑеÑÐµÐ½Ñ ÐºÐ¾Ð½ÑликÑов блокиÑовок на ÑÑовне ÑÑÑок пÑиведÑн в ТаблиÑе 13.3. ÐамеÑÑÑе, ÑÑо одна ÑÑанзакÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²Ð»Ð°Ð´ÐµÑÑ Ð½ÐµÑколÑкими конÑликÑÑÑÑими блокиÑовками одной ÑÑÑоки, даже в ÑазнÑÑ Ð¿Ð¾Ð´ÑÑанзакÑиÑÑ ; но две ÑазнÑÑ ÑÑанзакÑии никогда не полÑÑÐ°Ñ ÐºÐ¾Ð½ÑликÑÑÑÑие блокиÑовки одной и Ñой же ÑÑÑоки. ÐлокиÑовки на ÑÑовне ÑÑÑок блокиÑÑÑÑ ÑолÑко запиÑÑ Ð² опÑеделÑннÑе ÑÑÑоки, но никак не влиÑÑÑ Ð½Ð° вÑбоÑкÑ. СнимаÑÑÑÑ Ñакие блокиÑовки, как и блокиÑовки на ÑÑовне ÑаблиÑÑ, в конÑе ÑÑанзакÑии или пÑи оÑкаÑе к ÑоÑке ÑÐ¾Ñ ÑанениÑ.
Ð ÐµÐ¶Ð¸Ð¼Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки на ÑÑовне ÑÑÑок
-
FOR UPDATE Ð Ñежиме
FOR UPDATEÑÑÑоки, вÑданнÑе опеÑаÑоÑомSELECT, блокиÑÑÑÑÑÑ ÐºÐ°Ðº Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ. ÐÑи ÑÑом они заÑиÑаÑÑÑÑ Ð¾Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки, Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð´ÑÑгими ÑÑанзакÑиÑми до завеÑÑÐµÐ½Ð¸Ñ ÑекÑÑей. То еÑÑÑ Ð´ÑÑгие ÑÑанзакÑии, пÑÑаÑÑиеÑÑ Ð²ÑполниÑÑUPDATE,DELETE,SELECT FOR UPDATE,SELECT FOR NO KEY UPDATE,SELECT FOR SHAREилиSELECT FOR KEY SHAREÑ ÑÑими ÑÑÑоками, бÑдÑÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²Ð°Ð½Ñ Ð´Ð¾ завеÑÑÐµÐ½Ð¸Ñ ÑекÑÑей ÑÑанзакÑии; и наобоÑоÑ, командаSELECT FOR UPDATEбÑÐ´ÐµÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑ Ð¾ÐºÐ¾Ð½ÑÐ°Ð½Ð¸Ñ Ð¿Ð°ÑаллелÑной ÑÑанзакÑии, в коÑоÑой вÑполнилаÑÑ Ð¾Ð´Ð½Ð° из ÑÑÐ¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ Ñ Ñой же ÑÑÑокой, а заÑем ÑÑÑÐ°Ð½Ð¾Ð²Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð¸ веÑнÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑннÑÑ ÑÑÑÐ¾ÐºÑ (или не веÑнÑÑ, еÑли она бÑла Ñдалена). Ðднако в ÑÑанзакÑииREPEATABLE READилиSERIALIZABLEÐ²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ Ð¾Ñибка, еÑли блокиÑÑÐµÐ¼Ð°Ñ ÑÑÑока изменилаÑÑ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñа наÑала ÑÑанзакÑии. ÐодÑобнее ÑÑо обÑÑждаеÑÑÑ Ð² Разделе 13.4.Режим блокиÑовки
FOR UPDATEÑакже запÑаÑиваеÑÑÑ Ð½Ð° ÑÑовне ÑÑÑоки лÑбой командойDELETEи командойUPDATE, изменÑÑÑей знаÑÐµÐ½Ð¸Ñ Ð¾Ð¿ÑеделÑннÑÑ ÑÑолбÑов. РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовка ÑUPDATEкаÑаеÑÑÑ ÑÑолбÑов, по коÑоÑÑм Ñоздан ÑникалÑнÑй индекÑ, пÑименимÑй в каÑеÑÑве внеÑнего клÑÑа (Ñак ÑÑо на ÑаÑÑиÑнÑе индекÑÑ Ð¸ индекÑÑ Ð²ÑÑажений ÑÑо не ÑаÑпÑоÑÑÑанÑеÑÑÑ), но в бÑдÑÑем ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð¼ÐµÐ½ÑÑÑÑÑ.-
FOR NO KEY UPDATE ÐейÑÑвÑÐµÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾
FOR UPDATE, но запÑаÑÐ¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð² ÑÑом Ñежиме блокиÑовка Ñлабее: она не бÑÐ´ÐµÑ Ð±Ð»Ð¾ÐºÐ¸ÑоваÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´ÑSELECT FOR KEY SHARE, пÑÑаÑÑиеÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ ÑÐµÑ Ð¶Ðµ ÑÑÑок. ÐÑÐ¾Ñ Ñежим блокиÑовки Ñакже запÑаÑиваеÑÑÑ Ð»Ñбой командойUPDATE, коÑоÑÐ°Ñ Ð½Ðµ ÑÑебÑÐµÑ Ð±Ð»Ð¾ÐºÐ¸ÑовкиFOR UPDATE.-
FOR SHARE ÐейÑÑвÑÐµÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾
FOR NO KEY UPDATE, за иÑклÑÑением Ñого, ÑÑо Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ из полÑÑеннÑÑ ÑÑÑок запÑаÑиваеÑÑÑ ÑазделÑемаÑ, а не иÑклÑÑиÑелÑÐ½Ð°Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовка. РазделÑÐµÐ¼Ð°Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовка не позволÑÐµÑ Ð´ÑÑгим ÑÑанзакÑиÑм вÑполнÑÑÑ Ñ ÑÑими ÑÑÑокамиUPDATE,DELETE,SELECT FOR UPDATEилиSELECT FOR NO KEY UPDATE, но допÑÑкаеÑSELECT FOR SHAREиSELECT FOR KEY SHARE.-
FOR KEY SHARE ÐейÑÑвÑÐµÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾
FOR SHARE, но ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð±Ð¾Ð»ÐµÐµ ÑлабÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑовкÑ: блокиÑÑеÑÑÑSELECT FOR UPDATE, но неSELECT FOR NO KEY UPDATE. ÐлокиÑовка ÑазделÑемого клÑÑа не позволÑÐµÑ Ð´ÑÑгим ÑÑанзакÑиÑм вÑполнÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´ÑDELETEиUPDATE, ÑолÑко еÑли они менÑÑÑ Ð·Ð½Ð°Ñение клÑÑа (но не дÑÑгиеUPDATE), и пÑи ÑÑом допÑÑÐºÐ°ÐµÑ Ð²Ñполнение командSELECT FOR NO KEY UPDATE,SELECT FOR SHAREиSELECT FOR KEY SHARE.
Postgres Pro не деÑÐ¶Ð¸Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± изменÑннÑÑ
ÑÑÑокаÑ
в памÑÑи, Ñак ÑÑо никакиÑ
огÑаниÑений на ÑиÑло блокиÑÑемÑÑ
ÑÑÑок неÑ. Ðднако блокиÑовка ÑÑÑоки Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð²Ð»ÐµÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð½Ð° диÑк, напÑимеÑ, еÑли SELECT FOR UPDATE изменÑÐµÑ Ð²ÑбÑаннÑе ÑÑÑоки, ÑÑÐ¾Ð±Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸ÑоваÑÑ Ð¸Ñ
, пÑи ÑÑом пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð½Ð° диÑк.
ТаблиÑа 13.3. ÐонÑликÑÑÑÑие блокиÑовки на ÑÑовне ÑÑÑок
| ÐапÑаÑиâваемÑй Ñежим блокиâÑовки | ТекÑÑий Ñежим блокиÑовки | |||
|---|---|---|---|---|
| FOR KEY SHARE | FOR SHARE | FOR NO KEY UPDATE | FOR UPDATE | |
| FOR KEY SHARE | Â | Â | Â | X |
| FOR SHARE | Â | Â | X | X |
| FOR NO KEY UPDATE | Â | X | X | X |
| FOR UPDATE | X | X | X | X |
13.3.3. ÐлокиÑовки на ÑÑовне ÑÑÑаниÑ
Рдополнение к блокиÑовкам на ÑÑовне ÑаблиÑÑ Ð¸ ÑÑÑок, Ð´Ð»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑÑпом к ÑÑÑаниÑам ÑÐ°Ð±Ð»Ð¸Ñ Ð² обÑÐ¸Ñ Ð±ÑÑеÑÐ°Ñ Ð¸ÑполÑзÑÑÑÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки на ÑÑовне ÑÑÑаниÑ, иÑклÑÑиÑелÑнÑе и ÑазделÑемÑе. ÐÑи блокиÑовки оÑвобождаÑÑÑÑ Ð½ÐµÐ¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾ поÑле вÑбоÑки или Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑÑок. РазÑабоÑÑикам пÑиложений обÑÑно можно не задÑмÑваÑÑÑÑ Ð¾ блокиÑÐ¾Ð²ÐºÐ°Ñ ÑÑÑаниÑ, здеÑÑ Ð¾Ð½Ð¸ ÑпоминаÑÑÑÑ ÑолÑко Ð´Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑ ÐºÐ°ÑÑинÑ.
13.3.4. ÐзаимоблокиÑовки
ЧаÑÑое пÑименение ÑвнÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовок Ð¼Ð¾Ð¶ÐµÑ ÑвелиÑиÑÑ Ð²ÐµÑоÑÑноÑÑÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð±Ð»Ð¾ÐºÐ¸Ñовок, Ñо еÑÑÑ ÑиÑÑаÑий, когда две (или более) ÑÑанзакÑий деÑÐ¶Ð°Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки Ñак, ÑÑо взаимно блокиÑÑÑÑ Ð´ÑÑг дÑÑга. ÐапÑимеÑ, еÑли ÑÑанзакÑÐ¸Ñ 1 полÑÑÐ°ÐµÑ Ð¸ÑклÑÑиÑелÑнÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ ÑаблиÑÑ A, а заÑем пÑÑаеÑÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¸ÑклÑÑиÑелÑнÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ ÑаблиÑÑ B, коÑоÑÑÑ Ð´Ð¾ ÑÑого полÑÑила ÑÑанзакÑÐ¸Ñ 2, в даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑÑебÑÑÑÐ°Ñ Ð¸ÑклÑÑиÑелÑнÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ ÑаблиÑÑ A, ни одна из ÑÑанзакÑий не ÑÐ¼Ð¾Ð¶ÐµÑ Ð¿ÑодолжиÑÑ ÑабоÑÑ. Postgres Pro авÑомаÑиÑеÑки вÑÑвлÑÐµÑ Ñакие ÑиÑÑаÑии и ÑазÑеÑÐ°ÐµÑ Ð¸Ñ , пÑеÑÑÐ²Ð°Ñ Ð¾Ð´Ð½Ñ Ð¸Ð· ÑÑепивÑÐ¸Ñ ÑÑ ÑÑанзакÑий и Ñем ÑамÑм позволÑÑ Ð´ÑÑгой (дÑÑгим) пÑодолжиÑÑ ÑабоÑÑ. (ÐÐ°ÐºÐ°Ñ Ð¸Ð¼ÐµÐ½Ð½Ð¾ ÑÑанзакÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð¿ÑеÑвана, обÑÑно Ñложно пÑедÑказаÑÑ, Ñак ÑÑо ÑаÑÑÑиÑÑваÑÑ Ð½Ð° опÑеделÑнное поведение не ÑледÑеÑ.)
ÐамеÑÑÑе, ÑÑо взаимоблокиÑовки могÑÑ Ð²ÑзÑваÑÑÑÑ Ð¸ блокиÑовками на ÑÑовне ÑÑÑок (Ñаким обÑазом, они возможнÑ, даже еÑли не пÑименÑÑÑÑÑ ÑвнÑе блокиÑовки). РаÑÑмоÑÑим ÑлÑÑай, когда две паÑаллелÑнÑÑ ÑÑанзакÑии изменÑÑÑ ÑаблиÑÑ. ÐеÑÐ²Ð°Ñ ÑÑанзакÑÐ¸Ñ Ð²ÑполнÑеÑ:
UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 11111;
ÐÑи ÑÑом она полÑÑÐ°ÐµÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ ÑÑÑоки Ñ ÑказаннÑм номеÑом ÑÑÑÑа. ÐаÑем вÑоÑÐ°Ñ ÑÑанзакÑÐ¸Ñ Ð²ÑполнÑеÑ:
UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 22222; UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 11111;
ÐеÑвÑй опеÑаÑÐ¾Ñ UPDATE ÑÑпеÑно полÑÑÐ°ÐµÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ñказанной ÑÑÑоки и изменÑÐµÑ Ð´Ð°Ð½Ð½Ñе в ней. Ðднако вÑоÑой опеÑаÑÐ¾Ñ UPDATE обнаÑÑживаеÑ, ÑÑо ÑÑÑока, коÑоÑÑÑ Ð¾Ð½ пÑÑаеÑÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ, Ñже заблокиÑована, Ñак ÑÑо он ждÑÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ ÑÑанзакÑии, полÑÑивÑей блокиÑовкÑ. Таким обÑазом, вÑоÑÐ°Ñ ÑÑанзакÑÐ¸Ñ ÑÐ¼Ð¾Ð¶ÐµÑ Ð¿ÑодолжиÑÑÑÑ ÑолÑко поÑле завеÑÑÐµÐ½Ð¸Ñ Ð¿ÐµÑвой. ТепеÑÑ Ð¿ÐµÑÐ²Ð°Ñ ÑÑанзакÑÐ¸Ñ Ð²ÑполнÑеÑ:
UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 22222;
ÐеÑÐ²Ð°Ñ ÑÑанзакÑÐ¸Ñ Ð¿ÑÑаеÑÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑÑÑоки, но ей ÑÑо не ÑдаÑÑÑÑ: ÑÑа блокиÑовка Ñже пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ Ð²ÑоÑой ÑÑанзакÑии. ÐоÑÑÐ¾Ð¼Ñ Ð¿ÐµÑвой ÑÑанзакÑии оÑÑаÑÑÑÑ ÑолÑко ждаÑÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ Ð²ÑоÑой. Ð ÑезÑлÑÑаÑе пеÑÐ²Ð°Ñ ÑÑанзакÑÐ¸Ñ Ð±Ð»Ð¾ÐºÐ¸ÑÑеÑÑÑ Ð²ÑоÑой, а вÑоÑÐ°Ñ â пеÑвой: пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð±Ð»Ð¾ÐºÐ¸Ñовка. Postgres Pro вÑÑвлÑÐµÑ ÑÑÑ ÑиÑÑаÑÐ¸Ñ Ð¸ пÑеÑÑÐ²Ð°ÐµÑ Ð¾Ð´Ð½Ñ Ð¸Ð· ÑÑанзакÑий.
ÐбÑÑно лÑÑÑий ÑпоÑоб пÑедоÑвÑаÑÐµÐ½Ð¸Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð±Ð»Ð¾ÐºÐ¸Ñовок â добиÑÑÑÑ, ÑÑÐ¾Ð±Ñ Ð²Ñе пÑиложениÑ, обÑаÑаÑÑиеÑÑ Ðº базе даннÑÑ , запÑаÑивали блокиÑовки неÑколÑÐºÐ¸Ñ Ð¾Ð±ÑекÑов единообÑазно. Рданном пÑимеÑе, еÑли Ð±Ñ Ð¾Ð±Ðµ ÑÑанзакÑии изменÑли ÑÑÑоки в одном поÑÑдке, взаимоблокиÑовка Ð±Ñ Ð½Ðµ пÑоизоÑла. ÐлокиÑовки в ÑÑанзакÑии ÑледÑÐµÑ ÑпоÑÑдоÑиваÑÑ Ñак, ÑÑÐ¾Ð±Ñ Ð¿ÐµÑвой Ð´Ð»Ñ ÐºÐ°ÐºÐ¾Ð³Ð¾-либо обÑекÑа запÑаÑивалаÑÑ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ огÑаниÑиваÑÑÐ°Ñ Ð¸Ð· ÑÐµÑ , коÑоÑÑе Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ поÑÑебÑÑÑÑÑ. ÐÑли заÑанее обеÑпеÑиÑÑ Ñакой поÑÑдок нелÑзÑ, взаимоблокиÑовки можно обÑабоÑаÑÑ Ð¿Ð¾ ÑакÑÑ, повÑоÑÑÑ Ð¿ÑеÑваннÑе ÑÑанзакÑии.
ÐÑли ÑиÑÑаÑÐ¸Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð±Ð»Ð¾ÐºÐ¸Ñовки не бÑÐ´ÐµÑ Ð²ÑÑвлена, ÑÑанзакÑиÑ, ожидаÑÑÐ°Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки на ÑÑовне ÑаблиÑÑ Ð¸Ð»Ð¸ ÑÑÑоки, бÑÐ´ÐµÑ Ð¶Ð´Ð°ÑÑ ÐµÑ Ð¾ÑÐ²Ð¾Ð±Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð³ÑаниÑенное вÑемÑ. ÐÑо ознаÑаеÑ, ÑÑо пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾ÑÑавлÑÑÑ ÑÑанзакÑии оÑкÑÑÑÑми долгое вÑÐµÐ¼Ñ (напÑимеÑ, Ð¾Ð¶Ð¸Ð´Ð°Ñ Ð²Ð²Ð¾Ð´Ð° полÑзоваÑелÑ).
13.3.5. РекомендаÑелÑнÑе блокиÑовки
Postgres Pro Ñакже Ð¸Ð¼ÐµÐµÑ ÑÑедÑÑва ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовок, ÑмÑÑл коÑоÑÑÑ Ð¾Ð¿ÑеделÑÑÑ Ñами пÑиложениÑ. Такие блокиÑовки назÑваÑÑÑÑ ÑекомендаÑелÑнÑми, Ñак как ÑиÑÑема не ÑоÑÑиÑÑÐµÑ Ð¸Ñ Ð¸ÑполÑзование â пÑавилÑно Ð¸Ñ Ð¸ÑполÑзоваÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð¾ Ñамо пÑиложение. РекомендаÑелÑнÑе блокиÑовки бÑваÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ Ð´Ð»Ñ ÑеализаÑий ÑÑÑаÑегий блокиÑованиÑ, Ð¿Ð»Ð¾Ñ Ð¾ впиÑÑваÑÑÐ¸Ñ ÑÑ Ð² Ð¼Ð¾Ð´ÐµÐ»Ñ MVCC. ÐапÑимеÑ, ÑекомендаÑелÑнÑе блокиÑовки ÑаÑÑо пÑименÑÑÑÑÑ Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑÑаÑегии пеÑÑимиÑÑиÑной блокиÑовки, ÑипиÑной Ð´Ð»Ñ ÑиÑÑем ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñми «плоÑкий Ñайл». ХоÑÑ Ð´Ð»Ñ ÑÑого можно иÑполÑзоваÑÑ Ð¸ дополниÑелÑнÑе Ñлаги в ÑаблиÑÐ°Ñ , ÑекомендаÑелÑнÑе блокиÑовки ÑабоÑаÑÑ Ð±ÑÑÑÑее, не пÑиводÑÑ Ðº ÑаздÑÐ²Ð°Ð½Ð¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ Ð¸ авÑомаÑиÑеÑки ликвидиÑÑÑÑÑÑ ÑеÑвеÑом в конÑе ÑеанÑа.
Ð Postgres Pro еÑÑÑ Ð´Ð²Ð° ваÑианÑа полÑÑиÑÑ ÑекомендаÑелÑнÑе блокиÑовки: на ÑÑовне ÑеанÑа и на ÑÑовне ÑÑанзакÑии. РекомендаÑелÑÐ½Ð°Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовка, полÑÑÐµÐ½Ð½Ð°Ñ Ð½Ð° ÑÑовне ÑеанÑа, ÑдеÑживаеÑÑÑ, пока она не бÑÐ´ÐµÑ Ñвно оÑвобождена, или до конÑа ÑеанÑа. РоÑлиÑие Ð¾Ñ ÑÑандаÑÑнÑÑ ÑекомендаÑелÑнÑе блокиÑовки ÑÑÐ¾Ð²Ð½Ñ ÑеанÑа наÑÑÑаÑÑ Ð»Ð¾Ð³Ð¸ÐºÑ ÑÑанзакÑий â блокиÑовка, полÑÑÐµÐ½Ð½Ð°Ñ Ð² ÑÑанзакÑии, даже еÑли пÑоизойдÑÑ Ð¾ÑÐºÐ°Ñ ÑÑой ÑÑанзакÑии, бÑÐ´ÐµÑ ÑÐ¾Ñ ÑанÑÑÑÑÑ Ð² ÑеанÑе; аналогиÑно, оÑвобождение блокиÑовки оÑÑаÑÑÑÑ Ð² Ñиле, даже еÑли ÑÑанзакÑиÑ, в коÑоÑой оно бÑло вÑполнено, позже пÑеÑÑваеÑÑÑ. ÐÑзÑваÑÑий пÑоÑеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¿ÑоÑиÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð½ÐµÑколÑко Ñаз; пÑи ÑÑом ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð·Ð°Ð¿ÑоÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки должен ÑооÑвеÑÑÑвоваÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð¾ÑвобождениÑ, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð° бÑла дейÑÑвиÑелÑно оÑвобождена. РекомендаÑелÑнÑе блокиÑовки на ÑÑовне ÑÑанзакÑий, напÑоÑив, во многом Ð¿Ð¾Ñ Ð¾Ð¶Ð¸ на обÑÑнÑе блокиÑовки: они авÑомаÑиÑеÑки оÑвобождаÑÑÑÑ Ð² конÑе ÑÑанзакÑий и не ÑÑебÑÑÑ Ñвного оÑвобождениÑ. ÐÐ»Ñ ÐºÑаÑковÑеменного пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовок ÑÑо поведение ÑаÑÑо более ÑмеÑÑно, Ñем поведение ÑекомендаÑелÑнÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовок на ÑÑовне ÑеанÑа. ÐапÑоÑÑ ÑекомендаÑелÑнÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовок одного иденÑиÑикаÑоÑа на ÑÑовне ÑеанÑа и на ÑÑовне ÑÑанзакÑии бÑдÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑоваÑÑ Ð´ÑÑг дÑÑга вполне пÑедÑказÑемÑм обÑазом. ÐÑли ÑÐµÐ°Ð½Ñ Ñже Ð²Ð»Ð°Ð´ÐµÐµÑ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑекомендаÑелÑной блокиÑовкой, дополниÑелÑнÑе запÑоÑÑ ÐµÑ Ð² Ñом же ÑеанÑе бÑдÑÑ Ð²Ñегда ÑÑпеÑнÑ, даже еÑли ÐµÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑ Ð´ÑÑгие ÑеанÑÑ. ÐÑо ÑÑвеÑждение ÑпÑаведливо вне завиÑимоÑÑи Ð¾Ñ Ñого, на каком ÑÑовне (ÑеанÑа или ÑÑанзакÑии) ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ Ð¸Ð»Ð¸ запÑаÑиваÑÑÑÑ Ð½Ð¾Ð²Ñе блокиÑовки.
Ðак и оÑÑалÑнÑе блокиÑовки в Postgres Pro, вÑе ÑекомендаÑелÑнÑе блокиÑовки, ÑвÑзаннÑе Ñ Ð»ÑбÑми ÑеанÑами, можно пÑоÑмоÑÑеÑÑ Ð² ÑиÑÑемном пÑедÑÑавлении pg_locks.
Ð ÑекомендаÑелÑнÑе, и обÑÑнÑе блокиÑовки ÑÐ¾Ñ ÑанÑÑÑÑÑ Ð² облаÑÑи обÑей памÑÑи, ÑÐ°Ð·Ð¼ÐµÑ ÐºÐ¾ÑоÑой опÑеделÑеÑÑÑ Ð¿Ð°ÑамеÑÑами конÑигÑÑаÑии max_locks_per_transaction и max_connections. Ðажно, ÑÑÐ¾Ð±Ñ ÑÑой памÑÑи бÑло доÑÑаÑоÑно, Ñак как в пÑоÑивном ÑлÑÑае ÑеÑÐ²ÐµÑ Ð½Ðµ ÑÐ¼Ð¾Ð¶ÐµÑ Ð²ÑдаÑÑ Ð½Ð¸ÐºÐ°ÐºÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑовкÑ. Таким обÑазом, ÑиÑло ÑекомендаÑелÑнÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовок, коÑоÑÑе Ð¼Ð¾Ð¶ÐµÑ Ð²ÑдаÑÑ ÑеÑвеÑ, огÑаниÑиваеÑÑÑ Ð¾Ð±ÑÑно деÑÑÑками или ÑоÑнÑми ÑÑÑÑÑ Ð² завиÑимоÑÑи Ð¾Ñ ÐºÐ¾Ð½ÑигÑÑаÑии ÑеÑвеÑа.
РопÑеделÑннÑÑ
ÑлÑÑаÑÑ
пÑи иÑполÑзовании ÑекомендаÑелÑнÑÑ
блокиÑовок, оÑобенно в запÑоÑаÑ
Ñ ÑвнÑми ÑказаниÑми ORDER BY и LIMIT, важно ÑÑиÑÑваÑÑ, ÑÑо полÑÑаемÑе блокиÑовки могÑÑ Ð·Ð°Ð²Ð¸ÑеÑÑ Ð¾Ñ Ð¿Ð¾ÑÑдка вÑÑиÑÐ»ÐµÐ½Ð¸Ñ SQL-вÑÑажений. ÐапÑимеÑ:
SELECT pg_advisory_lock(id) FROM foo WHERE id = 12345; -- ok SELECT pg_advisory_lock(id) FROM foo WHERE id > 12345 LIMIT 100; -- опаÑно! SELECT pg_advisory_lock(q.id) FROM ( SELECT id FROM foo WHERE id > 12345 LIMIT 100 ) q; -- ok
Ð ÑÑом пÑимеÑе вÑоÑой ваÑÐ¸Ð°Ð½Ñ Ð¾Ð¿Ð°Ñен, Ñак как LIMIT не обÑзаÑелÑно бÑÐ´ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð¿ÐµÑед вÑзовом ÑÑнкÑии блокиÑовки. Ð ÑезÑлÑÑаÑе пÑиложение Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки, на коÑоÑÑе оно не ÑаÑÑÑиÑÑÐ²Ð°ÐµÑ Ð¸ коÑоÑÑе оно не ÑÐ¼Ð¾Ð¶ÐµÑ Ð¾ÑвободиÑÑ (до завеÑÑÐµÐ½Ð¸Ñ ÑеанÑа). С ÑоÑки зÑÐµÐ½Ð¸Ñ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñакие блокиÑовки окажÑÑÑÑ Ð² подвеÑенном ÑоÑÑоÑнии, Ñ
оÑÑ Ð¾Ð½Ð¸ и бÑдÑÑ Ð¾ÑобÑажаÑÑÑÑ Ð² pg_locks.
ФÑнкÑии, пÑедназнаÑеннÑе Ð´Ð»Ñ ÑабоÑÑ Ñ ÑекомендаÑелÑнÑми блокиÑовками, опиÑÐ°Ð½Ñ Ð² ÐодÑазделе 9.27.10.