Кушодани мудири қулфи Postgres. Брюс Момжян

Нусхаи гуфтугӯи Брюс Момҷиан дар соли 2020 "Кушодани мудири қулфи Postgres".

Кушодани мудири қулфи Postgres. Брюс Момжян

(Эзоҳ: Ҳама дархостҳои SQL-ро аз слайдҳо аз ин истинод дастрас кардан мумкин аст: http://momjian.us/main/writings/pgsql/locking.sql)

Салом! Боз дар Русия будан хеле хуб аст. Мебахшед, ки соли гузашта омада натавонистам, аммо имсол ману Иван наќшањои калон дорем. Ман умедворам, ки дар ин ҷо боз ҳам бештар хоҳам буд. Ман ба Русия омаданро дӯст медорам. Тюмен, Тверьро тамошо мекунам. Ман хеле шодам, ки ин шахрхоро тамошо карда метавонам.

Номи ман Брюс Момжян аст. Ман дар EnterpriseDB кор мекунам ва зиёда аз 23 сол бо Postgres кор мекунам. Ман дар Филаделфияи ИМА зиндагӣ мекунам. Ман тақрибан 90 рӯз дар як сол сафар мекунам. Ва ман тақрибан дар 40 конфронс иштирок мекунам. ман Вебсайт, ки слайдҳоеро дар бар мегирад, ки ман ҳоло ба шумо нишон медиҳам. Аз ин рӯ, пас аз конфронс шумо метавонед онҳоро аз вебсайти шахсии ман зеркашӣ кунед. Он инчунин тақрибан 30 презентатсияро дар бар мегирад. Инчунин видеоҳо ва шумораи зиёди вурудоти блог вуҷуд доранд, ки зиёда аз 500 аст. Ин як манбаи хеле иттилоотӣ аст. Ва агар шумо ба ин мавод таваҷҷӯҳ дошта бошед, ман шуморо даъват мекунам, ки онро истифода баред.

Пеш аз он ки бо Postgres кор карданро оғоз кунам, ман муаллим, профессор будам. Ва ман хеле шодам, ки акнун метавонам ба шумо чизе бигӯям, ки ба шумо мегӯям. Ин яке аз презентатсияҳои ҷолиби ман аст. Ва ин презентатсия аз 110 слайд иборат аст. Мо ба гапи содадо шуруъ мекунем ва дар охир дисобот беш аз пеш мураккаб шуда, хеле мураккаб мегардад.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ин як сӯҳбати хеле ногувор аст. Блоккунӣ мавзӯи маъмултарин нест. Мо мехоҳем, ки ин дар ҷое нест шавад. Ин мисли рафтан ба духтури дандон аст.

Кушодани мудири қулфи Postgres. Брюс Момжян

  1. Қулфкунӣ барои бисёр одамоне мебошад, ки дар пойгоҳи додаҳо кор мекунанд ва дар як вақт якчанд равандҳо иҷро мешаванд. Онҳо ба блок лозим аст. Яъне, имрӯз ман ба шумо дониши ибтидоӣ дар бораи блок додан медиҳам.
  2. ID-ҳои транзаксия. Ин як қисми хеле дилгиркунанда аз презентатсия аст, аммо онҳо бояд фаҳманд.
  3. Минбаъд мо дар бораи намудҳои блокҳо сӯҳбат хоҳем кард. Ин як қисми хеле механикӣ аст.
  4. Ва дар зер мо чанд мисоли бастани онро медиҳем. Ва фаҳмидани он хеле душвор хоҳад буд.

Кушодани мудири қулфи Postgres. Брюс Момжян

Биёед дар бораи басташавӣ сӯҳбат кунем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Истилоҳоти мо хеле мураккаб аст. Чанд нафари шумо медонед, ки ин порча аз куҷост? Ду нафар. Ин аз бозӣ бо номи Colossal Cave Adventure аст. Ман фикр мекунам, ин як бозии компютерии матнӣ дар солҳои 80-ум буд. Дар он ҷо шумо бояд ба ғор, ба лабиринт даромадед ва матн тағир ёфт, аммо мундариҷа ҳар дафъа тақрибан якхела буд. Ҳамин тавр, ман ин бозиро дар хотир дорам.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва дар ин ҷо мо номи қулфҳоро мебинем, ки аз Oracle ба мо омадаанд. Мо онҳоро истифода мебарем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Дар ин ҷо мо истилоҳҳоеро мебинем, ки маро ошуфта мекунанд. Масалан, SHARE UPDATE ECXLUSIVE. Оянда ЭКСПЛЮСИВИ ХОМИРО ДИҲЕД. Рости гап, ин номхо чандон равшан нестанд. Мо кӯшиш мекунем, ки онҳоро муфассалтар баррасӣ кунем. Баъзеҳо калимаи «ҳисса» доранд, ки маънои ҷудо карданро дорад. Баъзеҳо калимаи "истисноӣ" доранд. Баъзеҳо ҳардуи ин калимаҳоро дар бар мегиранд. Ман мехоҳам аз он оғоз кунам, ки ин қуфлҳо чӣ гуна кор мекунанд.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва калимаи "дастрасӣ" низ хеле муҳим аст. Ва калимаҳои "сатр" як сатр мебошанд. Яъне тақсимоти дастрасӣ, тақсимоти сатр.

Кушодани мудири қулфи Postgres. Брюс Момжян

Масъалаи дигаре, ки бояд дар Postgres фаҳмида шавад, ки мутаассифона ман онро дар нутқи худ баён карда наметавонам, MVCC аст. Ман дар вебсайти худ дар ин мавзӯъ муаррифии алоҳида дорам. Ва агар шумо фикр кунед, ки ин презентатсия душвор аст, MVCC эҳтимолан душвортарини ман аст. Ва агар шумо таваҷҷӯҳ дошта бошед, метавонед онро дар вебсайт тамошо кунед. Шумо метавонед видеоро тамошо кунед.

Кушодани мудири қулфи Postgres. Брюс Момжян

Чизи дигаре, ки мо бояд фаҳмем, ин ID транзаксия аст. Бисёр амалиётҳо бе идентификаторҳои беназир кор карда наметавонанд. Ва дар ин ҷо мо шарҳ медиҳем, ки транзаксия чист. Postgres дорои ду системаи рақамгузории транзаксия мебошад. Ман медонам, ки ин ҳалли хеле зебо нест.

Кушодани мудири қулфи Postgres. Брюс Момжян

Инчунин дар хотир доред, ки фаҳмидани слайдҳо хеле душвор хоҳад буд, бинобар ин он чизе, ки бо сурх нишон дода шудааст, ба он чизе, ки шумо бояд ба он диққат диҳед.

Кушодани мудири қулфи Postgres. Брюс Момжян

http://momjian.us/main/writings/pgsql/locking.sql

Биёед мебинем. Рақами транзаксия бо ранги сурх қайд карда мешавад. Функсияи SELECT pg_back дар ин ҷо нишон дода шудааст. Он муомилоти ман ва ID транзаксияро бармегардонад.

Як чизи дигар, агар ба шумо ин презентатсия маъқул бошад ва хоҳед, ки онро дар базаи худ иҷро кунед, пас шумо метавонед ба ин пайванд бо ранги гулобӣ гузаред ва SQL-ро барои ин презентатсия зеркашӣ кунед. Ва шумо метавонед онро танҳо дар PSQL-и худ иҷро кунед ва тамоми презентатсия фавран дар экрани шумо пайдо мешавад. Он гулҳоро дар бар намегирад, аммо ҳадди аққал мо онро дида метавонем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Дар ин ҳолат мо ID транзаксияро мебинем. Ин рақамест, ки мо ба ӯ додаем. Ва дар Postgres як намуди дигари ID транзаксия мавҷуд аст, ки онро ID транзакцияи виртуалӣ меноманд

Ва мо бояд инро дарк кунем. Ин хеле муҳим аст, вагарна мо қулф карданро дар Postgres фаҳмида наметавонем.

ID транзакси виртуалӣ ID транзаксия аст, ки дорои арзишҳои доимӣ нест. Масалан, агар ман фармони SELECT-ро иҷро кунам, пас эҳтимолан ман базаи маълумотро тағир намедиҳам ва ҳеҷ чизро қуфл намекунам. Ҳамин тавр, вақте ки мо SELECT оддиро иҷро мекунем, мо ба ин транзаксия ID-и доимӣ намедиҳем. Мо дар он ҷо ба ӯ танҳо ID-и виртуалӣ медиҳем.

Ва ин кори Postgres-ро беҳтар мекунад, қобилияти тозакуниро беҳтар мекунад, аз ин рӯ ID транзакцияи виртуалӣ аз ду рақам иборат аст. Рақами аввал пеш аз хати слэш ID пуштибонӣ мебошад. Ва дар тарафи рост мо танҳо ҳисобкунакро мебинем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Аз ин рӯ, агар ман дархостро иҷро кунам, он мегӯяд, ки ID-и пуштибонӣ 2 аст.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва агар ман як қатор чунин транзаксияҳоро иҷро кунам, пас мо мебинем, ки ҳисобкунак ҳар дафъае, ки ман дархостро иҷро мекунам, зиёд мешавад. Масалан, вақте ки ман дархостро иҷро мекунам 2/10, 2/11, 2/12 ва ғайра.

Кушодани мудири қулфи Postgres. Брюс Момжян

Дар хотир доред, ки дар ин ҷо ду сутун вуҷуд дорад. Дар тарафи чап мо ID транзакцияи виртуалиро мебинем - 2/12. Ва дар тарафи рост мо ID муомилоти доимӣ дорем. Ва ин майдон холӣ аст. Ва ин транзаксия пойгоҳи додаҳоро тағир намедиҳад. Пас, ман ба он ID муомилоти доимӣ намедиҳам.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ҳамин ки ман фармони таҳлилро иҷро мекунам ((ТАҲЛИЛИ)), ҳамон дархост ба ман ID транзакцияи доимиро медиҳад. Бубинед, ки ин барои мо чӣ гуна тағйир ёфт. Ман қаблан ин ID надоштам, аммо ҳоло онро дорам.

Кушодани мудири қулфи Postgres. Брюс Момжян

Инак, боз як дархост, муомилоти дигар. Рақами муомилоти виртуалӣ 2/13 аст. Ва агар ман ID-и муомилоти доимиро пурсам, пас вақте ки ман дархостро иҷро мекунам, ман онро мегирам.

Кушодани мудири қулфи Postgres. Брюс Момжян

Инак, бори дигар. Мо ID транзаксияҳои виртуалӣ ва ID транзакцияи доимӣ дорем. Барои фаҳмидани рафтори Postgres танҳо ин нуктаро фаҳмед.

Кушодани мудири қулфи Postgres. Брюс Момжян

Мо ба бахши сеюм мегузарем. Дар ин ҷо мо танҳо тавассути намудҳои гуногуни қулфҳо дар Postgres мегузарем. Ин хеле ҷолиб нест. Қисми охирин хеле ҷолибтар хоҳад буд. Аммо мо бояд чизҳои асосиро баррасӣ кунем, зеро дар акси ҳол мо намефаҳмем, ки баъд чӣ мешавад.

Мо аз ин бахш мегузарем, мо ҳар як намуди қулфро дида мебароем. Ва ман ба шумо мисолҳоеро нишон медиҳам, ки онҳо чӣ гуна насб карда шудаанд, чӣ гуна кор мекунанд, ман ба шумо баъзе дархостҳоеро нишон медиҳам, ки шумо метавонед барои дидани чӣ гуна қулфкунӣ дар Postgres кор кунед.

Кушодани мудири қулфи Postgres. Брюс Момжян

Барои эҷод кардани дархост ва дидани он ки дар Postgres чӣ рӯй дода истодааст, мо бояд дархостро дар намуди система барорем. Дар ин ҳолат, pg_lock бо сурх таъкид карда мешавад. Pg_lock ҷадвали системаест, ки ба мо мегӯяд, ки кадом қулфҳо дар Postgres ҳоло истифода мешаванд.

Аммо, барои ман худ ба шумо нишон додани pg_lock хеле душвор аст, зеро он хеле мураккаб аст. Ҳамин тавр, ман манзараеро сохтам, ки pg_locks -ро нишон медиҳад. Ва он инчунин барои ман коре мекунад, ки ба ман имкон медиҳад, ки беҳтар фаҳмам. Яъне, он қуфлҳои ман, сессияи шахсии ман ва ғайраҳоро истисно мекунад. Ин танҳо SQL-и стандартист ва он ба шумо имкон медиҳад, ки ба шумо чӣ рӯй дода истодааст, беҳтар нишон диҳед.

Кушодани мудири қулфи Postgres. Брюс Момжян

Мушкилоти дигар ин аст, ки ин манзара хеле васеъ аст, бинобар ин ман бояд як дуюм - lockview2 эҷод кунам.

Кушодани мудири қулфи Postgres. Брюс Момжян Ва он ба ман сутунҳои бештарро аз ҷадвал нишон медиҳад. Ва дигаре, ки ба ман сутунҳои боқимондаро нишон медиҳад. Ин хеле мураккаб аст, бинобар ин ман кӯшиш кардам, ки онро то ҳадди имкон содда пешниҳод кунам.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ҳамин тавр, мо ҷадвалеро бо номи Lockdemo сохтем. Ва мо дар он ҷо як хат ташкил кардем. Ин ҷадвали намунавии мост. Ва мо танҳо барои нишон додани намунаҳои қуфлҳо бахшҳо эҷод мекунем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Пас, як сатр, як сутун. Навъи якуми қулф ACCESS SHARE номида мешавад. Ин маҳдудияти камтарин маҳдудкунанда аст. Ин маънои онро дорад, ки он амалан бо қуфлҳои дигар мухолифат намекунад.

Ва агар мо хоҳем, ки қулфро ба таври возеҳ муайян кунем, мо фармони "мизи қулф" -ро иҷро мекунем. Ва он бешубҳа блок хоҳад кард, яъне дар ҳолати ACCESS SHARE мо ҷадвали қулфро оғоз мекунем. Ва агар ман PSQL-ро дар замина иҷро кунам, пас ман сессияи дуюмро аз сессияи аввалини худ ҳамин тавр оғоз мекунам. Яъне, ман дар ин ҷо чӣ кор мекунам? Ман ба сессияи дигар меравам ва ба он мегӯям, ки "ба ман намуди қулфи ин дархостро нишон диҳед." Ва дар ин ҷо ман дар ин ҷадвал AccessShareLock дорам. Ин маҳз ҳамон чизест, ки ман дархост кардам. Ва мегуяд, ки блок таъин шудааст. Хеле содда.

Кушодани мудири қулфи Postgres. Брюс Момжян

Илова бар ин, агар мо ба сутуни дуюм назар кунем, пас дар он ҷо ҳеҷ чиз нест. Онҳо холӣ ҳастанд.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва агар ман фармони "SELECT" -ро иҷро кунам, пас ин роҳи ғайримуқаррарии дархости AccessShareLock аст. Ҳамин тавр, ман ҷадвали худро озод мекунам ва дархостро иҷро мекунам ва дархост сатрҳои сершуморро бармегардонад. Ва дар яке аз сатрҳо мо AccessShareLock-ро мебинем. Ҳамин тариқ, SELECT AccessShareLock-ро дар ҷадвал даъват мекунад. Ва он бо ҳеҷ чиз мухолифат намекунад, зеро он қулфи сатҳи паст аст.

Кушодани мудири қулфи Postgres. Брюс Момжян

Чӣ мешавад, агар ман SELECT-ро иҷро кунам ва се ҷадвали гуногун дошта бошам? Пештар ман танҳо як ҷадвалро иҷро мекардам, ҳоло ман се мизро иҷро мекунам: pg_class, pg_namespace ва pg_attribute.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва ҳоло вақте ки ман ба дархост назар мекунам, ман 9 AccessShareLocks-ро дар се ҷадвал мебинам. Чаро? Се ҷадвал бо ранги кабуд таъкид шудааст: pg_attribute, pg_class, pg_namespace. Аммо шумо инчунин метавонед бубинед, ки ҳамаи индексҳо, ки тавассути ин ҷадвалҳо муайян карда мешаванд, AccessShareLock низ доранд.

Ва ин як қулфест, ки амалан бо дигарон мухолифат намекунад. Ва ин танҳо он аст, ки мо ҳангоми интихоби он ҷадвалро аз нав танзим кунем. Ин маъно дорад. Яъне, агар мо ҷадвалро интихоб кунем, он дар ҳамон лаҳза нопадид мешавад, пас ин нодуруст аст, ҳамин тавр AccessShare қулфи сатҳи паст аст, ки ба мо мегӯяд, ки "ҳангоми кор кардан ин ҷадвалро напартоед". Аслан, он чизест, ки вай мекунад.

Кушодани мудири қулфи Postgres. Брюс Момжян

ROW SHARE - Ин қулф каме фарқ мекунад.

Кушодани мудири қулфи Postgres. Брюс Момжян

Биёед мисолро гирем. SELECT ROW SHARE усули бастани ҳар як сатрро алоҳида. Бо ин роҳ ҳеҷ кас наметавонад онҳоро нест кунад ё тағир диҳад, вақте ки мо онҳоро тамошо мекунем.

Кушодани мудири қулфи Postgres. Брюс МомжянПас, SHARE LOCK чӣ кор мекунад? Мо мебинем, ки ID транзаксия 681 барои SELECT аст. Ва ин ҷолиб аст. Дар ин ҷо чӣ шуд? Бори аввал мо рақамро дар майдони "Қулф" мебинем. Мо ID транзаксияро мегирем ва он мегӯяд, ки он дар реҷаи истисноӣ онро манъ мекунад. Ҳама чиз ин аст, ки мегӯяд, ки ман як сатр дорам, ки дар ҷое дар ҷадвал маҳкам аст. Аммо ӯ дақиқ намегӯяд, ки дар куҷост. Мо инро каме баъдтар муфассалтар дида мебароем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Дар ин ҷо мо мегӯем, ки қулф аз ҷониби мо истифода мешавад.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ҳамин тавр, қулфи истисноӣ ба таври возеҳ мегӯяд, ки он истисноӣ аст. Ва инчунин, агар шумо як сатри ин ҷадвалро нест кунед, он гоҳ чӣ тавре ки шумо мебинед, рӯй медиҳад.

Кушодани мудири қулфи Postgres. Брюс Момжян

SHARE EXCLUSIVE як қулфи дарозтар аст.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ин фармони анализатори (ТАҲЛИЛИ) аст, ки истифода мешавад.

Кушодани мудири қулфи Postgres. Брюс Момжян

ҚУЛФИ SHARE - шумо метавонед ба таври возеҳ дар ҳолати мубодила қулф кунед.

Кушодани мудири қулфи Postgres. Брюс Момжян

Шумо инчунин метавонед индекси беназир эҷод кунед. Ва дар он ҷо шумо метавонед SHARE LOCK-ро бинед, ки қисми онҳост. Ва он мизро қуфл мекунад ва ба он як SHARE LOCK мегузорад.

Бо нобаёнӣ, SHARE LOCK дар ҷадвал маънои онро дорад, ки одамони дигар ҷадвалро хонда метавонанд, аммо ҳеҷ кас наметавонад онро тағир диҳад. Ва ин маҳз ҳамон чизест, ки шумо як шохиси беназирро эҷод мекунед.

Агар ман як индекси беназири ҳамзамон эҷод кунам, ман намуди дигари қулф хоҳам дошт, зеро тавре ки шумо дар ёд доред, истифодаи индексҳои ҳамзамон талаботи қулфкуниро кам мекунад. Ва агар ман қулфи муқаррарӣ, индекси муқаррариро истифода барам, пас ман аз навиштан ба индекси ҷадвал ҳангоми сохтани он пешгирӣ мекунам. Агар ман индекси ҳамзамон истифода барам, пас ман бояд намуди дигари қулфро истифода барам.

Кушодани мудири қулфи Postgres. Брюс Момжян

SHARE ROW EXCLUSIVE - боз он метавонад ба таври возеҳ муқаррар карда шавад (равшан).

Кушодани мудири қулфи Postgres. Брюс Момжян

Ё мо метавонем қоида эҷод кунем, яъне як ҳолати мушаххасеро гирем, ки дар он он истифода мешавад.

Кушодани мудири қулфи Postgres. Брюс Момжян

Қулфкунии ИСТИСНОИИ маънои онро дорад, ки ҳеҷ каси дигар наметавонад ҷадвалро иваз кунад.

Кушодани мудири қулфи Postgres. Брюс Момжян

Дар ин ҷо мо намудҳои гуногуни қулфҳоро мебинем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Масалан, ACCESS EXCLUSIVE як фармони бастани аст. Масалан, агар шумо CLUSTER table, он гоҳ ин маънои онро дорад, ки ҳеҷ кас дар он ҷо навишта наметавонад. Ва он на танҳо худи ҷадвал, балки индексҳоро низ қуфл мекунад.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ин саҳифаи дуюми блоккунии ACCESS EXCLUSIVE мебошад, ки дар он мо мебинем, ки маҳз он чиро дар ҷадвал блок мекунад. Он сатрҳои ҷадвали алоҳидаро қулф мекунад, ки ин хеле ҷолиб аст.

Ин ҳама маълумоти асосӣест, ки ман мехостам бидиҳам. Мо дар бораи қулфҳо, дар бораи ID-ҳои транзаксия, мо дар бораи ID-ҳои транзаксияҳои виртуалӣ, дар бораи ID-ҳои доимии транзаксия сӯҳбат кардем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва ҳоло мо якчанд мисолҳои блокро меомӯзем. Ин қисми ҷолибтарин аст. Мо ҳолатҳои хеле ҷолибро дида мебароем. Ва ҳадафи ман дар ин муаррифӣ он аст, ки ба шумо фаҳмиши беҳтаре дар бораи он, ки Postgres воқеан ҳангоми кӯшиши бастани чизҳои муайян чӣ кор мекунад. Ман фикр мекунам, ки вай дар бастани қисмҳо хеле хуб аст.

Биёед якчанд мисоли мушаххасро дида бароем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Мо бо ҷадвалҳо ва як қатор дар ҷадвал оғоз мекунем. Вақте ки ман чизеро ворид мекунам, ман ExclusiveLock, ID Transaction ва ExclusiveLock дар ҷадвал нишон дода мешаванд.

Кушодани мудири қулфи Postgres. Брюс Момжян

Агар ман ду сатри дигар гузорам, чӣ мешавад? Ва ҳоло мизи мо се қатор дорад. Ва ман як сатр ворид кардам ва инро ҳамчун натиҷа гирифтам. Ва агар ман ду қатори дигар гузорам, ин чӣ аҷиб аст? Дар ин ҷо як чизи аҷибе вуҷуд дорад, зеро ман ба ин ҷадвал се сатр илова кардам, аммо ман дар ҷадвали қулф ду сатр дорам. Ва ин аслан рафтори асосии Postgres аст.

Бисёр одамон фикр мекунанд, ки агар шумо дар пойгоҳи додаҳо 100 сатрро қулф кунед, пас шумо бояд 100 вурудоти қулфро эҷод кунед. Агар ман якбора 1 сатрро маҳкам кунам, пас ба ман 000 чунин дархост лозим мешавад. Ва агар ба ман як миллион ё миллиард лозим бошад, то баста шавад. Аммо агар мо ин корро кунем, он чандон хуб кор намекунад. Агар шумо системаеро истифода карда бошед, ки барои ҳар як сатри инфиродӣ сабтҳои блокро эҷод мекунад, пас шумо мебинед, ки ин мушкил аст. Азбаски шумо бояд фавран ҷадвали қулфро муайян кунед, ки метавонад пур шавад, аммо Postgres ин корро намекунад.

Ва он чизе, ки дар ин слайд воқеан муҳим аст, он аст, ки он ба таври возеҳ нишон медиҳад, ки системаи дигаре вуҷуд дорад, ки дар дохили MVCC кор мекунад, ки сатрҳои алоҳидаро қуфл мекунад. Ҳамин тавр, вақте ки шумо миллиардҳо сатрҳоро қулф мекунед, Postgres як миллиард фармонҳои алоҳидаи қулфкуниро эҷод намекунад. Ва ин ба хосилнокии мехнат таъсири хеле хуб мерасонад.

Кушодани мудири қулфи Postgres. Брюс Момжян

Дар бораи навсозӣ чӣ гуфтан мумкин аст? Ман ҳоло сатрро нав карда истодаам ва шумо мебинед, ки он якбора ду амалиёти гуногунро иҷро кардааст. Он дар як вақт мизро қуфл мекард, аммо индексро низ бастааст. Ва ӯ бояд индексро маҳкам кунад, зеро дар ин ҷадвал маҳдудиятҳои беназир мавҷуданд. Ва мо мехоҳем боварӣ ҳосил кунем, ки ҳеҷ кас онро тағир намедиҳад, бинобар ин мо онро манъ мекунем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Агар ман мехоҳам ду сатрро навсозӣ кунам, чӣ мешавад? Ва мо мебинем, ки ӯ низ ҳамин тавр рафтор мекунад. Мо ду маротиба зиёдтар навсозӣ мекунем, аммо маҳз ҳамон шумораи хатҳои қулф.

Агар шумо дар ҳайрат бошед, ки чӣ тавр Postgres ин корро мекунад, ба шумо лозим меояд, ки гуфтугӯҳои маро дар MVCC гӯш кунед, то бифаҳмед, ки Postgres ин сатрҳоро дар дохили он тағир медиҳад. Ва Postgres як роҳе дорад, ки ин корро мекунад, аммо онро дар сатҳи қулфкунии ҷадвал иҷро намекунад, онро дар сатҳи пасттар ва муассиртар мекунад.

Кушодани мудири қулфи Postgres. Брюс Момжян

Чӣ мешавад, агар ман мехоҳам чизеро нест кунам? Агар ман, масалан, як сатрро нест кунам ва ман то ҳол ду вуруди бастани худро дорам ва ҳатто агар ман мехоҳам ҳамаи онҳоро нест кунам, онҳо ҳанӯз дар он ҷо ҳастанд.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва, масалан, ман мехоҳам, ки 1 сатр ворид кунам ва баъд 000 сатрро нест кунам ё илова кунам, пас он сатрҳои алоҳидае, ки ман илова мекунам ё тағир медиҳам, онҳо дар ин ҷо сабт намешаванд. Онҳо дар сатҳи поёнтар дар худи силсила навишта шудаанд. Ва дар рафти нутки MVCC ман дар ин бора муфассал сухан рондам. Аммо вақте ки шумо қуфлҳоро таҳлил мекунед, хеле муҳим аст, то боварӣ ҳосил кунед, ки шумо дар сатҳи ҷадвал қулф карда истодаед ва намебинед, ки сатрҳои инфиродӣ дар ин ҷо чӣ гуна сабт карда мешаванд.

Кушодани мудири қулфи Postgres. Брюс Момжян

Дар бораи бастани ошкоро чӣ гуфтан мумкин аст?

Кушодани мудири қулфи Postgres. Брюс Момжян

Агар ман навсозӣ -ро пахш кунам, ман ду сатр баста мешавам. Ва агар ман ҳамаи онҳоро интихоб кунам ва "дар ҳама ҷо навсозӣ" -ро клик кунам, пас ман то ҳол ду сабти басташавӣ дорам.

Кушодани мудири қулфи Postgres. Брюс Момжян

Мо барои ҳар як сатри алоҳида сабтҳои алоҳида эҷод намекунем. Азбаски он вақт ҳосилнокӣ коҳиш меёбад, метавонад аз ҳад зиёд бошад. Ва мо метавонем худро дар вазъияти ногувор пайдо кунем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва ҳамон чизест, ки агар мо мубодила кунем, мо метавонем ҳамаашро 30 маротиба иҷро кунем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Мо ҷадвали худро барқарор мекунем, ҳама чизро нест мекунем ва сипас як сатрро дубора ворид мекунем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Рафтори дигаре, ки шумо дар Postgres мебинед, ки рафтори хеле хуб маълум ва дилхоҳ аст, ки шумо метавонед навсозӣ ё интихоб кунед. Ва шумо метавонед ин корро ҳамзамон иҷро кунед. Ва интихоб навсозӣ ва ҳамон чизеро дар самти муқобил манъ намекунад. Мо ба хонанда мегӯем, ки нависандаро набандад, нависанда ҳам пеши хонандаро нагирифтааст.

Ман ба шумо як мисоли инро нишон медиҳам. Ман ҳоло интихоб хоҳам кард. Пас мо INSERT-ро иҷро мекунем. Ва он гоҳ шумо метавонед бубинед - 694. Шумо метавонед ID-и транзаксияро, ки ин воридкуниро анҷом додааст, бубинед. Ва ин тавр кор мекунад.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва агар ман ҳоло ба ID-и пуштибонии худ нигоҳ кунам, он ҳоло 695 аст.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва ман дар ҷадвали ман 695-ро мебинам.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва агар ман дар ин ҷо чунин навсозӣ кунам, пас ман парвандаи дигар мегирам. Дар ин ҳолат, 695 қулфи истисноӣ аст ва навсозӣ ҳамон рафтор дорад, аммо дар байни онҳо ихтилоф вуҷуд надорад, ки ин хеле ғайриоддӣ аст.

Ва шумо мебинед, ки дар боло он ShareLock аст ва дар поёни он ExclusiveLock аст. Ва ҳарду транзаксия анҷом ёфт.

Ва шумо бояд сӯҳбати маро дар MVCC гӯш кунед, то бифаҳмед, ки ин чӣ гуна рӯй медиҳад. Аммо ин як мисолест, ки шумо метавонед онро дар як вақт иҷро кунед, яъне дар як вақт SELECT ва UPDATE иҷро кунед.

Кушодани мудири қулфи Postgres. Брюс Момжян

Биёед дубора барқарор кунем ва як амалиёти дигарро анҷом диҳем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Агар шумо кӯшиш кунед, ки ду навсозиро ҳамзамон дар як сатр иҷро кунед, он баста мешавад. Ва дар хотир доред, ман гуфтам, ки хонанда пеши нависандаро намегирад ва нависанда пеши хонандаро намегирад, балки як нависанда нависандаи дигарро мебандад. Яъне мо наметавонем ду нафарро дар як сатр навсозӣ кунем. Шумо бояд интизор шавед, ки яке аз онҳо тамом шавад.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва барои нишон додани ин, ман ба ҷадвали Lockdemo назар мекунам. Ва мо як сатрро дида мебароем. Барои як транзаксия 698.

Мо инро ба 2 навсозӣ кардем. 699 навсозии аввалин аст. Ва он бомуваффақият буд ё он дар амалиёти интизорӣ қарор дорад ва интизор аст, ки мо тасдиқ ё бекор кунем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Аммо ба чизи дигар нигаред - 2/51 аввалин муомилоти мо, сессияи аввалини мост. 3/112 дархости дуюмест, ки аз боло омадааст, ки ин арзишро ба 3 иваз кардааст. Ва агар шумо аҳамият диҳед, дар боло худ қуфл шуд, ки 699 аст. Аммо 3/112 қулфро надодааст. Сутуни Lock_mode мегӯяд, ки он чиро интизор аст. Он 699-ро интизор аст. Ва агар шумо ба 699 ​​нигоҳ кунед, он баландтар аст. Ва сессияи якум чй кор кард? Вай дар ID транзакцияи худ қулфи истисноӣ сохт. Ҳамин тавр Postgres ин корро мекунад. Он ID транзакцияи худро блок мекунад. Ва агар шумо хоҳед, ки интизор шавед, ки касе тасдиқ ё бекор кунад, пас шумо бояд интизор шавед, ки транзаксия дар интизорӣ вуҷуд дорад. Ва аз ин рӯ, мо метавонем як хатти аҷибе мебинем.

Биёед бори дигар назар кунем. Дар тарафи чап мо ID коркарди худро мебинем. Дар сутуни дуюм мо ID транзаксияҳои виртуалии худро мебинем ва дар сеюм мо lock_type -ро мебинем. Ин чӣ маъно дорад? Аслан он чизе ки дар он гуфта мешавад, ин аст, ки он ID транзаксияро манъ мекунад. Аммо аҳамият диҳед, ки ҳамаи сатрҳо дар поён робита мегӯянд. Ва ҳамин тавр шумо дар рӯи миз ду намуди қулфҳо доред. Қулфи муносибат вуҷуд дорад. Ва он гоҳ басташавии транзаксия мавҷуд аст, ки дар он шумо худатон блок мекунед, ки маҳз ҳамон чизест, ки дар сатри аввал ё дар поёни он рӯй медиҳад, транзаксия дар он ҷост, ки мо 699-ро интизорем, ки амалиёти худро ба анҷом расонад.

Ман бубинам, ки дар ин ҷо чӣ мешавад. Ва дар ин ҷо ду чиз дар як вақт рӯй медиҳад. Шумо ба қулфи ID транзаксия дар сатри аввал менигаред, ки худашро қуфл мекунад. Ва ӯ худро бастааст, то мардумро интизор шавад.

Агар шумо ба сатри 6-ум нигоҳ кунед, он ҳамон сабти аввал аст. Аз ин рӯ, транзаксияи 699 баста шудааст. 700 низ худкушӣ аст. Ва он гоҳ дар сатри поён шумо хоҳед дид, ки мо мунтазири 699 ҳастем, ки амалиёти худро анҷом диҳад.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва дар lock_type, tuple шумо рақамҳоро мебинед.

Кушодани мудири қулфи Postgres. Брюс Момжян

Шумо мебинед, ки он 0/10 аст. Ва ин рақами саҳифа ва инчунин ҷуброни ин сатри мушаххас аст.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва шумо мебинед, вақте ки мо навсозӣ мекунем, он 0/11 мешавад.

Кушодани мудири қулфи Postgres. Брюс Момжян

Аммо дар асл 0/10 аст, зеро интизори ин амалиёт вуҷуд дорад. Мо имконият дорем, ки бубинем, ки ин силсилаест, ки ман интизори тасдиқи он ҳастам.

Кушодани мудири қулфи Postgres. Брюс Момжян

Пас аз он ки мо онро тасдиқ кардем ва ӯҳдадориро пахш кардем ва вақте ки навсозӣ ба итмом мерасад, ин он чизест, ки мо боз ба даст меорем. Муомилоти 700 ягона қулф аст, он каси дигарро интизор нест, зеро он содир шудааст. Он танҳо интизори анҷоми транзаксия аст. Вақте ки 699 тамом мешавад, мо дигар чизеро интизор намешавем. Ва ҳоло транзаксияи 700 мегӯяд, ки ҳама чиз хуб аст ва он дорои ҳама қулфҳои зарурӣ дар ҳама ҷадвалҳои иҷозатдодашуда аст.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва барои боз ҳам мураккабтар кардани ин ҳама, мо назари дигареро эҷод мекунем, ки ин дафъа ба мо иерархияро фароҳам меорад. Ман интизор нестам, ки шумо ин дархостро мефаҳмед. Аммо ин ба мо дар бораи он чизе, ки рӯй дода истодааст, равшантар медиҳад.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ин намуди рекурсивӣ аст, ки бахши дигар низ дорад. Ва он гоҳ ҳама чизро дубора ба ҳам меорад. Биёед инро истифода барем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Чӣ мешавад, агар мо дар як вақт се навсозӣ кунем ва бигӯем, ки сатр ҳоло се аст. Ва мо аз 3 ба 4 иваз мекунем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва дар ин ҷо мо мебинем 4. Ва транзаксия ID 702.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва он гоҳ ман аз 4 ба 5 иваз мекунам. Ва 5 ба 6 ва 6 ба 7. Ва ман як қатор одамонеро, ки мунтазири анҷоми ин як транзаксия хоҳанд буд.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва ҳама чиз равшан мешавад. Сатри аввал чист? Ин 702 аст. Ин ID транзаксияест, ки дар аввал ин арзишро муқаррар кардааст. Дар сутуни додаи ман чӣ навишта шудааст? Ман нишонаҳо дорам f. Инҳо навсозиҳои ман ҳастанд, ки (5, 6, 7) тасдиқ карда намешаванд, зеро мо интизори анҷоми транзаксияи ID 702 ҳастем. Дар он ҷо мо блоки ID транзаксия дорем. Ва ин боиси 5 қулфҳои ID транзаксия мегардад.

Ва агар шумо ба 704 нигаред, дар 705, дар он ҷо то ҳол чизе навишта нашудааст, зеро онҳо ҳанӯз намедонанд, ки чӣ рӯй дода истодааст. Онҳо танҳо менависанд, ки намедонанд, ки чӣ рӯй дода истодааст. Ва онҳо танҳо ба хоб мераванд, зеро онҳо интизоранд, ки касе тамом шавад ва вақте ки имкони иваз кардани сатрҳо вуҷуд дорад, бедор шавад.

Кушодани мудири қулфи Postgres. Брюс Момжян

Чунин ба назар мерасад. Маълум аст, ки ҳама интизори навбати 12 мебошанд.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ин аст он чизе ки мо дар ин ҷо дидем. Ин аст 0/12.

Кушодани мудири қулфи Postgres. Брюс Момжян

Пас, вақте ки транзаксияи аввал тасдиқ карда мешавад, шумо метавонед дар ин ҷо бинед, ки иерархия чӣ гуна кор мекунад. Ва акнун ҳама чиз равшан мешавад. Ҳамаашон пок мешаванд. Ва онҳо воқеан ҳанӯз интизоранд.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ин аст он чизе ки рӯй дода истодааст. 702 ухдадор шудааст. Ва ҳоло 703 ин қулфи сатрро мегирад ва сипас 704 интизори 703-ро иҷро мекунад. Ва 705 низ инро интизор аст. Ва ҳангоме ки ҳамаи ин анҷом мешавад, онҳо худро тоза мекунанд. Ва ман мехоҳам қайд намоям, ки ҳама дар саф истодаанд. Ва ин ба вазъияте, ки ҳама дар интизори мошини аввал ҳастанд, хеле монанд аст. Мошини аввал меистад ва ҳама дар як қатори дароз меистанд. Он гоҳ вай ҳаракат мекунад, пас мошини навбатӣ метавонад пеш равад ва блоки худро гирад ва ғайра.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва агар ин барои шумо ба қадри кофӣ мураккаб набошад, мо ҳоло бо шумо дар бораи бунбастҳо сӯҳбат хоҳем кард. Ман намедонам, ки кадоме аз шумо ба онҳо дучор шудаед. Ин як мушкилоти хеле маъмул дар системаҳои пойгоҳи додаҳост. Аммо бунбастҳо вақтест, ки як ҷаласа интизори як ҷаласаи дигар аст, то коре кунад. Ва дар айни замон сессияи дигар интизори сессияи якум аст, ки коре кунад.

Ва, масалан, агар Иван гӯяд: "Ба ман чизе деҳ" ва ман мегӯям: "Не, ман онро ба шумо медиҳам, агар шумо ба ман чизи дигаре диҳед." Ва мегӯяд: «Не, агар ба ман надиҳӣ, ман онро ба ту намедиҳам». Ва мо ба вазъияти бунбаст дучор мешавем. Боварй дорам, ки Иван ин корро намекунад, вале шумо ин маъноро мефахмед, ки мо ду нафаре дорем, ки чизе гирифтан мехоханд ва онхо тайёр нестанд, ки касе чизеро ба онхо дихад. Ва ҳеҷ ҳалли нест.

Ва аслан, базаи шумо бояд инро ошкор кунад. Ва он гоҳ шумо бояд яке аз сессияҳоро нест кунед ё пӯшед, зеро дар акси ҳол онҳо то абад дар он ҷо хоҳанд монд. Ва мо онро дар пойгоҳи додаҳо мебинем, мо онро дар системаҳои оператсионӣ мебинем. Ва дар ҳама ҷойҳое, ки мо равандҳои мувозӣ дорем, ин метавонад рӯй диҳад.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва акнун мо ду блокро насб мекунем. Мо 50 ва 80 мегузорем. Дар сатри аввал ман аз 50 то 50 навсозӣ мекунам. Ман рақами транзаксияро мегирам 710.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва он гоҳ ман 80 ба 81 ва 50 ба 51 иваз мекунам.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва ин аст, ки он чӣ гуна хоҳад буд. Ҳамин тавр, 710 як қатор баста шудааст ва 711 интизори тасдиқ аст. Мо инро ҳангоми навсозӣ дидем. 710 соҳиби силсилаи мост. Ва 711 интизор аст, ки 710 транзаксияро анҷом диҳад.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва ҳатто мегӯяд, ки бунбастҳо дар кадом сатр рух медиҳанд. Ва ин ҷост, ки он аҷиб ба даст меояд.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ҳоло мо аз 80 то 80 навсозӣ мекунем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва ин аст, ки бунбастҳо оғоз мешаванд. 710 мунтазири посух аз 711 аст ва 711 мунтазири 710. Ва ин кор хуб нест. Ва ҳеҷ роҳе аз ин вуҷуд надорад. Ва онҳо аз ҳамдигар посух интизоранд.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва он танҳо ба таъхир ҳама чизро оғоз мекунад. Ва мо инро намехоҳем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва Postgres дорои роҳҳои пайхас кардани ин ҳодиса мебошад. Ва вақте ки ин рӯй медиҳад, шумо ин хатогиро мегиред. Ва аз ин маълум мешавад, ки фалон раванд интизори SHARE LOCK аз раванди дигар аст, яъне бо раванди 711 банд шудааст. Ва он раванд интизори дода шудани SHARE LOCK дар ID фалон транзаксия буд ва бо фалон раванд баста шуд. Бинобар ин дар ин чо вазъияти бунбаст ба амал омадааст.

Кушодани мудири қулфи Postgres. Брюс Момжян

Оё бунбасти сетарафа вуҷуд дорад? Мумкин ки? Бале.

Кушодани мудири қулфи Postgres. Брюс Момжян

Мо ин рақамҳоро ба ҷадвал дохил мекунем. Мо 40 ба 40 иваз мекунем, блок мекунем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Мо 60-ро ба 61, 80-ро ба 81 иваз мекунем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва он гоҳ мо 80-ро иваз мекунем ва сипас бум!

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва 714 ҳоло интизори 715 аст. 716-ум 715-умро интизор аст. Ва дар ин бора чизе кардан мумкин нест.

Кушодани мудири қулфи Postgres. Брюс Момжян

Дар ин ҷо дигар ду нафар нест, аллакай се нафар ҳастанд. Ман аз ту чизе мехоҳам, ин кас аз шахси сеюм чизе мехоҳад ва сеюмӣ аз ман чизе мехоҳад. Ва мо интизори сетарафа мешавем, зеро ҳама интизори онем, ки шахси дигар кореро, ки бояд анҷом диҳад, анҷом диҳад.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва Postgres медонад, ки ин дар кадом сатр рух медиҳад. Ва аз ин рӯ, он ба шумо паёми зеринро медиҳад, ки нишон медиҳад, ки шумо мушкилоте доред, ки се вуруд ба ҳамдигар монеъ мешаванд. Ва дар ин ҷо ягон маҳдудият вуҷуд надорад. Ин метавонад дар ҳолате бошад, ки 20 вуруд якдигарро манъ мекунанд.

Кушодани мудири қулфи Postgres. Брюс Момжян

Мушкилоти навбатӣ сериализатсияшаванда аст.

Кушодани мудири қулфи Postgres. Брюс Момжян

Агар қулфи махсуси serializable.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва мо ба 719 бармегардем. Баромади он комилан муқаррарӣ аст.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва шумо метавонед клик кунед, то транзаксияро аз serializable анҷом диҳед.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва шумо мефаҳмед, ки шумо ҳоло як намуди дигари қулфи SA доред - ин маънои сериализатсияшавандаро дорад.

Кушодани мудири қулфи Postgres. Брюс Момжян

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва аз ин рӯ, мо як навъи нави қулф бо номи SARieadLock дорем, ки қулфи силсилавӣ аст ва ба шумо имкон медиҳад, ки сериалҳоро ворид кунед.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва инчунин шумо метавонед индексҳои беназир дохил кунед.

Кушодани мудири қулфи Postgres. Брюс Момжян

Дар ин ҷадвал мо индексҳои беназир дорем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Пас, агар ман рақами 2-ро дар ин ҷо гузорам, пас ман 2 дорам. Аммо дар боло, ман 2-и дигарро гузоштам. Ва шумо мебинед, ки 721 қулфи истисноӣ дорад. Аммо ҳоло 722 мунтазири анҷоми амалиёти 721 аст, зеро он наметавонад 2-ро ворид кунад, то он даме, ки бо 721 чӣ рӯй медиҳад.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва агар мо субтрансдия кунем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Дар ин ҷо мо 723 дорем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва агар мо нуқтаро захира кунем ва онро навсозӣ кунем, пас мо ID-и нави транзаксия мегирем. Ин як намунаи дигари рафторест, ки шумо бояд аз он огоҳ бошед. Агар мо инро баргардонем, пас ID транзаксия нест мешавад. 724 меравад. Аммо ҳоло мо 725 дорем.

Пас, ман дар ин ҷо чӣ кор карданӣ ҳастам? Ман кӯшиш мекунам ба шумо намунаҳои қулфҳои ғайриоддиеро, ки шумо метавонед пайдо кунед, нишон диҳам: хоҳ он қулфҳои сериализатсияшаванда бошад ё SAVEPOINT, инҳо намудҳои гуногуни қулфҳо мебошанд, ки дар ҷадвали қулф пайдо мешаванд.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ин эҷоди қулфҳои возеҳ (возеҳ) мебошад, ки дорои pg_advisory_lock мебошанд.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва шумо мебинед, ки намуди блоккунӣ ҳамчун маслиҳат номбар шудааст. Ва дар ин ҷо бо сурх "маслиҳат" навишта шудааст. Ва шумо метавонед ҳамзамон бо pg_advisory_unlock маҳкам кунед.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва дар охир мехостам ба шумо як чизи дигарро нишон дихам. Ман як намуди дигар эҷод мекунам. Аммо ман ба ҷадвали pg_locks бо ҷадвали pg_stat_activity ҳамроҳ мешавам. Ва чаро ман мехоҳам ин корро кунам? Зеро ин ба ман имкон медиҳад, ки ҳама ҷаласаҳои ҷорӣро бубинам ва бубинам, ки маҳз чӣ гуна қулфҳоро интизоранд. Ва ин хеле ҷолиб аст, вақте ки мо ҷадвали қулф ва ҷадвали дархостро якҷоя мекунем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва дар ин ҷо мо pg_stat_view эҷод мекунем.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва мо сатрро як ба як навсозӣ мекунем. Ва дар ин ҷо мо 724-ро мебинем. Ва он гоҳ мо сатри худро ба се навсозӣ мекунем. Ва шумо ҳоло дар ин ҷо чӣ мебинед? Инҳо дархостҳоянд, яъне шумо тамоми рӯйхати дархостҳоеро, ки дар сутуни чап номбар шудаанд, мебинед. Ва он гоҳ дар тарафи рост шумо метавонед блокҳо ва он чизеро, ки онҳо эҷод мекунанд, бубинед. Ва он метавонад барои шумо равшантар бошад, то шумо набояд ҳар дафъа ба ҳар як ҷаласа баргардед ва бубинед, ки оё шумо бояд ба он ҳамроҳ шавед ё не. Онҳо ин корро барои мо мекунанд.

Хусусияти дигаре, ки хеле муфид аст pg_blocking_pids. Шумо шояд ҳеҷ гоҳ дар бораи вай нашунидаед. Вай чӣ кор мекунад? Он ба мо имкон медиҳад бигӯем, ки барои ин ҷаласа 11740 кадом ID-ҳои мушаххаси равандро интизор аст. Ва шумо мебинед, ки 11740 интизори 724 аст. Ва 724 дар боло аст. Ва 11306 ID раванди шумост. Аслан, ин функсия аз ҷадвали қулфи шумо мегузарад. Ва ман медонам, ки ин каме мураккаб аст, аммо шумо онро фаҳмида метавонед. Аслан ин функсия аз ин ҷадвали қулф мегузарад ва мекӯшад пайдо кунад, ки дар куҷо ин ID раванд қуфлҳоеро, ки интизоранд, дода мешавад. Ва он инчунин кӯшиш мекунад, ки муайян кунад, ки кадом ID протсесси раванде, ки қулфро интизор аст, дорад. Пас шумо метавонед ин функсияро иҷро кунед pg_blocking_pids.

Ва ин метавонад хеле муфид бошад. Мо инро танҳо дар версияи 9.6 илова кардем, бинобар ин ин хусусият ҳамагӣ 5 сол аст, аммо он хеле ва хеле муфид аст. Ва ҳамин чиз ба дархости дуюм дахл дорад. Он маҳз он чизеро, ки мо бояд бубинем, нишон медиҳад.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ин аст он чизе ки ман мехостам бо шумо дар бораи он сӯҳбат кунам. Ва тавре ки ман интизор будам, мо тамоми вақти худро сарф мекардем, зеро слайдҳо хеле зиёд буданд. Ва слайдҳо барои зеркашӣ дастрасанд. Ман мехоҳам ба шумо барои дар ин ҷо буданатон ташаккур гӯям. Боварӣ дорам, ки аз конфронс баҳра хоҳед бурд, ташаккури зиёд!

саволҳои:

Масалан, агар ман кӯшиш мекунам, ки сатрҳоро навсозӣ кунам ва сеанси дуюм кӯшиш кунад, ки тамоми ҷадвалро нест кунад. То ҷое ки ман мефаҳмам, бояд чизе монанди қулфи ният бошад. Оё дар Postgres чунин чизе ҳаст?

Кушодани мудири қулфи Postgres. Брюс Момжян

Биёед ба ибтидои аввал баргардем. Шумо метавонед дар хотир доред, ки вақте ки шумо ягон кор мекунед, масалан ҳангоми SELECT, мо AccessShareLock-ро медиҳем. Ва ин аз афтидани ҷадвал пешгирӣ мекунад. Пас, агар шумо, масалан, хоҳед, ки сатри ҷадвалро навсозӣ кунед ё сатрро нест кунед, касе наметавонад дар як вақт тамоми ҷадвалро нест кунад, зеро шумо ин AccessShareLock-ро дар тамоми ҷадвал ва болои сатр нигоҳ медоред. Ва вақте ки шумо анҷом додед, онҳо метавонанд онро нест кунанд. Аммо вақте ки шумо дар он ҷо чизеро мустақиман тағир медиҳед, онҳо ин корро карда наметавонанд.

Биёед боз ин корро кунем. Биёед ба мисоли тозакунӣ гузарем. Ва шумо мебинед, ки чӣ гуна қулфи истисноӣ дар сатри болои тамоми ҷадвал мавҷуд аст.

Ин ба монанди қулфи истисноӣ хоҳад буд, дуруст?

Бале, ба назар чунин мерасад. Ман мефаҳмам, ки шумо дар бораи чӣ мегӯед. Шумо мегӯед, ки агар ман SELECT -ро анҷом диҳам, ман ShareExclusive дорам ва баъд онро Row Exclusive месозам, оё ин мушкилот мешавад? Аммо тааҷҷубовар аст, ки ин мушкилот ба вуҷуд намеорад. Чунин ба назар мерасад, ки дараҷаи қулф баланд мешавад, аммо аслан ман қулф дорам, ки ҳазф карданро пешгирӣ мекунад. Ва ҳоло, вақте ки ман ин қулфро пурқувваттар мегардонам, он ҳанӯз ҳам ҳазф карданро пешгирӣ мекунад. Аз ин рӯ, ман боло намеравам. Яъне, вақте ки он дар сатҳи поёнтар буд, аз рӯй додани он пешгирӣ кард, бинобар ин вақте ки ман сатҳашро боло мекунам, он ҳанӯз ҳам аз нест кардани ҷадвал пешгирӣ мекунад.

Ман мефаҳмам, ки шумо дар бораи чӣ мегӯед. Дар ин ҷо ягон ҳолати таҳаввулоти қулф вуҷуд надорад, ки дар он шумо кӯшиш мекунед, ки як қулфро аз як қулф гузошта, қуфлро қавитар ҷорӣ кунед. Дар ин ҷо он танҳо ин пешгириро дар саросари тахта зиёд мекунад, бинобар ин он ягон ихтилофро ба вуҷуд намеорад. Аммо саволи хуб аст. Ташаккури зиёд барои пурсидани ин!

Вақте ки мо сеансҳои зиёд, шумораи зиёди корбарон дорем, мо бояд чӣ кор кунем, то аз вазъияти бунбаст нагирем?

Postgres ба таври худкор ҳолатҳои сарбастаро пай мебарад. Ва он ба таври худкор яке аз сессияҳоро нест мекунад. Ягона роҳи пешгирӣ кардани блоки мурда ин бастани одамон бо ҳамон тартиб аст. Пас, вақте ки шумо ба аризаи худ назар мекунед, аксар вақт сабаби бунбастҳо ... Биёед тасаввур кунем, ки ман мехоҳам ду чизи гуногунро маҳкам кунам. Як барнома ҷадвали 1-ро қуфл мекунад ва барномаи дигар 2 ва сипас ҷадвали 1-ро қуфл мекунад. Ва роҳи осонтарини пешгирӣ аз бунбаст ин назар кардан ба замимаи шумо ва кӯшиш кунед, ки қулфкунӣ бо як тартиб дар тамоми барномаҳо сурат мегирад. Ва ин одатан 80% мушкилотро бартараф мекунад, зеро ҳама намуди одамон ин барномаҳоро менависанд. Ва агар шумо онҳоро бо ҳамон тартиб масдуд кунед, пас шумо ба вазъияти сарбаста дучор намешавед.

Ташаккури зиёд барои иҷрои шумо! Шумо дар бораи пур аз вакуум гап задед ва агар ман дуруст фаҳмам, пур аз вакуум тартиби сабтҳоро дар нигаҳдории алоҳида вайрон мекунад, бинобар ин онҳо сабтҳои ҷориро бетағйир нигоҳ медоранд. Чаро пур аз вакуум дастрасии истисноии қулфро мегирад ва чаро он бо амалиёти навиштан мухолифат мекунад?

Ин саволи хуб аст. Сабаб дар он аст, ки чангкашак пур мизро мегирад. Ва мо аслан версияи нави ҷадвалро эҷод карда истодаем. Ва миз нав хоҳад буд. Маълум мешавад, ки ин версияи комилан нави ҷадвал хоҳад буд. Ва мушкилот дар он аст, ки вақте ки мо ин корро мекунем, мо намехоҳем, ки одамон онро хонанд, зеро мо бояд ҷадвали навро бубинем. Ва ин ба саволи қаблӣ пайваст мешавад. Агар мо дар як вақт хонда метавонистем, онро ба ҷои дигар интиқол дода, одамонро ба мизи нав равона карда наметавонем. Мо бояд интизор шавем, ки ҳама хондани ин ҷадвалро тамом кунанд ва аз ин рӯ, он аслан як ҳолати истисноии қулф аст.
Мо танҳо мегӯем, ки мо аз аввал қулф мекунем, зеро мо медонем, ки дар ниҳоят ба мо қулфи истисноӣ лозим аст, то ҳама ба нусхаи нав интиқол дода шаванд. Ҳамин тавр, мо метавонем ин масъаларо ҳал кунем. Ва мо ин корро бо индексатсияи ҳамзамон иҷро мекунем. Аммо ин корро кардан хеле душвортар аст. Ва ин ба саволи қаблии шумо дар бораи қулфи истисноӣ алоқаманд аст.

Оё имкон аст, ки ба Postgres вақти қулфро илова кард? Дар Oracle, ман метавонам, масалан, "интихоб барои навсозӣ" нависед ва пеш аз навсозӣ 50 сония интизор шавед. Ин барои ариза хуб буд. Аммо дар Postgres, ба ман лозим аст, ки онро фавран иҷро кунам ва умуман интизор нашавам ё то чанд вақт интизор шавам.

Бале, шумо метавонед дар қуфлҳои худ, дар қуфлҳои худ як вақтро интихоб кунед. Шумо инчунин метавонед фармони бидуни роҳ бароред, ки он... агар шумо фавран қулфро гирифта натавонед. Аз ин рӯ, ё вақти қулф ё чизи дигаре, ки ба шумо имкон медиҳад, ки ин корро кунед. Ин дар сатҳи синтаксисӣ анҷом дода намешавад. Ин ҳамчун тағирёбанда дар сервер анҷом дода мешавад. Баъзан инро истифода бурдан мумкин нест.

Метавонед слайди 75-ро кушоед?

Бале.

Кушодани мудири қулфи Postgres. Брюс Момжян

Ва саволи ман ин аст. Чаро ҳарду равандҳои навсозӣ 703-ро интизоранд?

Ва ин саволи бузург аст. Ман намефаҳмам, ки чаро Postgres ин корро мекунад. Аммо вақте ки 703 офарида шуд, он интизори 702 буд. Ва вақте ки 704 ва 705 пайдо мешаванд, ба назар чунин менамояд, ки онҳо намедонанд, ки чӣ интизоранд, зеро дар он ҷо ҳанӯз чизе нест. Ва Postgres ин корро ин тавр мекунад: вақте ки шумо қулф гирифта наметавонед, вай менависад "Дар коркарди шумо чӣ маъно дорад?", зеро шумо аллакай касеро интизоред. Ҳамин тавр, мо танҳо ба он иҷозат медиҳем, ки дар ҳаво овезон шавад, он тамоман навсозӣ намекунад. Аммо дар ин ҷо чӣ шуд? Ҳамин ки 702 равандро анҷом дод ва 703 қулфи худро гирифт, система баргашт. Ва ӯ гуфт, ки ҳоло мо ду нафар дорем, ки интизоранд. Ва он гоҳ биёед онҳоро якҷоя навсозӣ кунем. Ва биёед нишон диҳем, ки ҳарду интизоранд.

Ман намедонам, ки чаро Postgres ин корро мекунад. Аммо мушкилоте вуҷуд дорад, ки f…. Ба назари ман, ин истилоҳ дар забони русӣ нест. Ин аст, ки ҳама интизори як қалъа ҳастанд, ҳатто агар 20 мақомот дар интизори қалъа ҳастанд. Ва ногаҳон ҳама дар як вақт бедор мешаванд. Ва ҳама кӯшиш мекунанд, ки вокуниш нишон диҳанд. Аммо система тавре месозад, ки ҳама интизори 703 бошанд. Ва агар ягон дархости нави дигаре пайдо шавад, ки пас аз ин тавлид шудааст, масалан, 707, пас боз холӣ хоҳад буд.

Ва ба назари ман, ин кор барои он анҷом шудааст, ки бигӯем, ки дар ин марҳала 702 мунтазири 703 аст ва ҳамаи онҳое, ки баъд аз он меоянд, дар ин соҳа ягон вуруд надоранд. Аммо ҳамин ки пешхизмати аввал меравад, ҳамаи онҳое, ки дар он лаҳза пеш аз навсозӣ интизор буданд, ҳамон аломатро мегиранд. Ва аз ин рӯ, ман фикр мекунам, ки ин кор карда мешавад, то ки мо бо тартиби коркард коркард кунем, то онҳо дуруст фармоиш дода шаванд.

Ман ҳамеша ба ин як падидаи хеле аҷиб назар мекардам. Зеро дар ин ҷо, масалан, мо онҳоро умуман номбар намекунем. Аммо ба назарам, хар дафъае, ки мо як кулфи нав медихем, мо ба хамаи онхое, ки дар арафаи интизорй мебошанд, менигарем. Сипас, мо ҳамаро як қатор мекунем. Ва он гоҳ ҳар як наве, ки ворид мешавад, танҳо пас аз анҷоми коркарди шахси навбатӣ ба навбат медарояд. Саволи хеле хуб. Ташаккури зиёд барои саволатон!

Ба назари ман, вақте ки 705 704-ро интизор аст, хеле мантиқтар аст.

Аммо мушкилот дар ин ҷо дар зер аст. Аз ҷиҳати техникӣ, шумо метавонед як ё дигареро бедор кунед. Ва ҳамин тавр мо як ё дигареро бедор мекунем. Аммо дар система чӣ мешавад? Шумо метавонед бубинед, ки чӣ тавр 703 дар боло ID транзакцияи шахсии худро маҳкам кардааст. Postgres ҳамин тавр кор мекунад. Ва 703 бо ID транзакцияи худ баста шудааст, бинобар ин, агар касе интизор шудан мехоҳад, пас онҳо 703-ро интизор мешаванд. Ва дар асл, 703 анҷом медиҳад. Ва танҳо пас аз анҷоми он яке аз равандҳо бедор мешавад. Ва мо намедонем, ки ин раванд маҳз чӣ гуна хоҳад буд. Сипас, мо ҳама чизро тадриҷан коркард мекунем. Аммо маълум нест, ки кадом раванд аввал бедор мешавад, зеро он метавонад яке аз ин равандҳо бошад. Аслан, мо як нақшакаш доштем, ки гуфт, ки ҳоло мо метавонем ҳама гуна ин равандҳоро бедор кунем. Мо танҳо якеро ба таври тасодуфӣ интихоб мекунем. Ҳамин тавр, ҳардуи онҳоро бояд қайд кард, зеро мо метавонем ҳар кадоми онҳоро бедор кунем.

Ва мушкилот дар он аст, ки мо CP-инфиният дорем. Ва аз ин рӯ, эҳтимол дорад, ки мо баъдтарро бедор кунем. Ва агар, масалан, мо баъдтарро бедор кунем, мо касеро, ки нав блок гирифтааст, интизор мешавем, аз ин рӯ муайян намекунем, ки кӣ аввал бедор мешавад. Мо танҳо чунин вазъиятро эҷод мекунем ва система онҳоро бо тартиби тасодуфӣ бедор мекунад.

вуҷуд доранд мақолаҳо дар бораи қуфлҳо аз ҷониби Егор Рогов. Нигоҳ кунед, онҳо низ ҷолиб ва муфиданд. Мавзӯъ, албатта, хеле мураккаб аст. Ташаккури зиёд, Брюс!

Манбаъ: will.com

Илова Эзоҳ