Нусхаи гуфтугӯи Брюс Момҷиан дар соли 2020 "Кушодани мудири қулфи Postgres".
(Эзоҳ: Ҳама дархостҳои SQL-ро аз слайдҳо аз ин истинод дастрас кардан мумкин аст:
Салом! Боз дар Русия будан хеле хуб аст. Мебахшед, ки соли гузашта омада натавонистам, аммо имсол ману Иван наќшањои калон дорем. Ман умедворам, ки дар ин ҷо боз ҳам бештар хоҳам буд. Ман ба Русия омаданро дӯст медорам. Тюмен, Тверьро тамошо мекунам. Ман хеле шодам, ки ин шахрхоро тамошо карда метавонам.
Номи ман Брюс Момжян аст. Ман дар EnterpriseDB кор мекунам ва зиёда аз 23 сол бо Postgres кор мекунам. Ман дар Филаделфияи ИМА зиндагӣ мекунам. Ман тақрибан 90 рӯз дар як сол сафар мекунам. Ва ман тақрибан дар 40 конфронс иштирок мекунам. ман
Пеш аз он ки бо Postgres кор карданро оғоз кунам, ман муаллим, профессор будам. Ва ман хеле шодам, ки акнун метавонам ба шумо чизе бигӯям, ки ба шумо мегӯям. Ин яке аз презентатсияҳои ҷолиби ман аст. Ва ин презентатсия аз 110 слайд иборат аст. Мо ба гапи содадо шуруъ мекунем ва дар охир дисобот беш аз пеш мураккаб шуда, хеле мураккаб мегардад.
Ин як сӯҳбати хеле ногувор аст. Блоккунӣ мавзӯи маъмултарин нест. Мо мехоҳем, ки ин дар ҷое нест шавад. Ин мисли рафтан ба духтури дандон аст.
- Қулфкунӣ барои бисёр одамоне мебошад, ки дар пойгоҳи додаҳо кор мекунанд ва дар як вақт якчанд равандҳо иҷро мешаванд. Онҳо ба блок лозим аст. Яъне, имрӯз ман ба шумо дониши ибтидоӣ дар бораи блок додан медиҳам.
- ID-ҳои транзаксия. Ин як қисми хеле дилгиркунанда аз презентатсия аст, аммо онҳо бояд фаҳманд.
- Минбаъд мо дар бораи намудҳои блокҳо сӯҳбат хоҳем кард. Ин як қисми хеле механикӣ аст.
- Ва дар зер мо чанд мисоли бастани онро медиҳем. Ва фаҳмидани он хеле душвор хоҳад буд.
Биёед дар бораи басташавӣ сӯҳбат кунем.
Истилоҳоти мо хеле мураккаб аст. Чанд нафари шумо медонед, ки ин порча аз куҷост? Ду нафар. Ин аз бозӣ бо номи Colossal Cave Adventure аст. Ман фикр мекунам, ин як бозии компютерии матнӣ дар солҳои 80-ум буд. Дар он ҷо шумо бояд ба ғор, ба лабиринт даромадед ва матн тағир ёфт, аммо мундариҷа ҳар дафъа тақрибан якхела буд. Ҳамин тавр, ман ин бозиро дар хотир дорам.
Ва дар ин ҷо мо номи қулфҳоро мебинем, ки аз Oracle ба мо омадаанд. Мо онҳоро истифода мебарем.
Дар ин ҷо мо истилоҳҳоеро мебинем, ки маро ошуфта мекунанд. Масалан, SHARE UPDATE ECXLUSIVE. Оянда ЭКСПЛЮСИВИ ХОМИРО ДИҲЕД. Рости гап, ин номхо чандон равшан нестанд. Мо кӯшиш мекунем, ки онҳоро муфассалтар баррасӣ кунем. Баъзеҳо калимаи «ҳисса» доранд, ки маънои ҷудо карданро дорад. Баъзеҳо калимаи "истисноӣ" доранд. Баъзеҳо ҳардуи ин калимаҳоро дар бар мегиранд. Ман мехоҳам аз он оғоз кунам, ки ин қуфлҳо чӣ гуна кор мекунанд.
Ва калимаи "дастрасӣ" низ хеле муҳим аст. Ва калимаҳои "сатр" як сатр мебошанд. Яъне тақсимоти дастрасӣ, тақсимоти сатр.
Масъалаи дигаре, ки бояд дар Postgres фаҳмида шавад, ки мутаассифона ман онро дар нутқи худ баён карда наметавонам, MVCC аст. Ман дар вебсайти худ дар ин мавзӯъ муаррифии алоҳида дорам. Ва агар шумо фикр кунед, ки ин презентатсия душвор аст, MVCC эҳтимолан душвортарини ман аст. Ва агар шумо таваҷҷӯҳ дошта бошед, метавонед онро дар вебсайт тамошо кунед. Шумо метавонед видеоро тамошо кунед.
Чизи дигаре, ки мо бояд фаҳмем, ин ID транзаксия аст. Бисёр амалиётҳо бе идентификаторҳои беназир кор карда наметавонанд. Ва дар ин ҷо мо шарҳ медиҳем, ки транзаксия чист. Postgres дорои ду системаи рақамгузории транзаксия мебошад. Ман медонам, ки ин ҳалли хеле зебо нест.
Инчунин дар хотир доред, ки фаҳмидани слайдҳо хеле душвор хоҳад буд, бинобар ин он чизе, ки бо сурх нишон дода шудааст, ба он чизе, ки шумо бояд ба он диққат диҳед.
Биёед мебинем. Рақами транзаксия бо ранги сурх қайд карда мешавад. Функсияи SELECT pg_back дар ин ҷо нишон дода шудааст. Он муомилоти ман ва ID транзаксияро бармегардонад.
Як чизи дигар, агар ба шумо ин презентатсия маъқул бошад ва хоҳед, ки онро дар базаи худ иҷро кунед, пас шумо метавонед ба ин пайванд бо ранги гулобӣ гузаред ва SQL-ро барои ин презентатсия зеркашӣ кунед. Ва шумо метавонед онро танҳо дар PSQL-и худ иҷро кунед ва тамоми презентатсия фавран дар экрани шумо пайдо мешавад. Он гулҳоро дар бар намегирад, аммо ҳадди аққал мо онро дида метавонем.
Дар ин ҳолат мо ID транзаксияро мебинем. Ин рақамест, ки мо ба ӯ додаем. Ва дар Postgres як намуди дигари ID транзаксия мавҷуд аст, ки онро ID транзакцияи виртуалӣ меноманд
Ва мо бояд инро дарк кунем. Ин хеле муҳим аст, вагарна мо қулф карданро дар Postgres фаҳмида наметавонем.
ID транзакси виртуалӣ ID транзаксия аст, ки дорои арзишҳои доимӣ нест. Масалан, агар ман фармони SELECT-ро иҷро кунам, пас эҳтимолан ман базаи маълумотро тағир намедиҳам ва ҳеҷ чизро қуфл намекунам. Ҳамин тавр, вақте ки мо SELECT оддиро иҷро мекунем, мо ба ин транзаксия ID-и доимӣ намедиҳем. Мо дар он ҷо ба ӯ танҳо ID-и виртуалӣ медиҳем.
Ва ин кори Postgres-ро беҳтар мекунад, қобилияти тозакуниро беҳтар мекунад, аз ин рӯ ID транзакцияи виртуалӣ аз ду рақам иборат аст. Рақами аввал пеш аз хати слэш ID пуштибонӣ мебошад. Ва дар тарафи рост мо танҳо ҳисобкунакро мебинем.
Аз ин рӯ, агар ман дархостро иҷро кунам, он мегӯяд, ки ID-и пуштибонӣ 2 аст.
Ва агар ман як қатор чунин транзаксияҳоро иҷро кунам, пас мо мебинем, ки ҳисобкунак ҳар дафъае, ки ман дархостро иҷро мекунам, зиёд мешавад. Масалан, вақте ки ман дархостро иҷро мекунам 2/10, 2/11, 2/12 ва ғайра.
Дар хотир доред, ки дар ин ҷо ду сутун вуҷуд дорад. Дар тарафи чап мо ID транзакцияи виртуалиро мебинем - 2/12. Ва дар тарафи рост мо ID муомилоти доимӣ дорем. Ва ин майдон холӣ аст. Ва ин транзаксия пойгоҳи додаҳоро тағир намедиҳад. Пас, ман ба он ID муомилоти доимӣ намедиҳам.
Ҳамин ки ман фармони таҳлилро иҷро мекунам ((ТАҲЛИЛИ)), ҳамон дархост ба ман ID транзакцияи доимиро медиҳад. Бубинед, ки ин барои мо чӣ гуна тағйир ёфт. Ман қаблан ин ID надоштам, аммо ҳоло онро дорам.
Инак, боз як дархост, муомилоти дигар. Рақами муомилоти виртуалӣ 2/13 аст. Ва агар ман ID-и муомилоти доимиро пурсам, пас вақте ки ман дархостро иҷро мекунам, ман онро мегирам.
Инак, бори дигар. Мо ID транзаксияҳои виртуалӣ ва ID транзакцияи доимӣ дорем. Барои фаҳмидани рафтори Postgres танҳо ин нуктаро фаҳмед.
Мо ба бахши сеюм мегузарем. Дар ин ҷо мо танҳо тавассути намудҳои гуногуни қулфҳо дар Postgres мегузарем. Ин хеле ҷолиб нест. Қисми охирин хеле ҷолибтар хоҳад буд. Аммо мо бояд чизҳои асосиро баррасӣ кунем, зеро дар акси ҳол мо намефаҳмем, ки баъд чӣ мешавад.
Мо аз ин бахш мегузарем, мо ҳар як намуди қулфро дида мебароем. Ва ман ба шумо мисолҳоеро нишон медиҳам, ки онҳо чӣ гуна насб карда шудаанд, чӣ гуна кор мекунанд, ман ба шумо баъзе дархостҳоеро нишон медиҳам, ки шумо метавонед барои дидани чӣ гуна қулфкунӣ дар Postgres кор кунед.
Барои эҷод кардани дархост ва дидани он ки дар Postgres чӣ рӯй дода истодааст, мо бояд дархостро дар намуди система барорем. Дар ин ҳолат, pg_lock бо сурх таъкид карда мешавад. Pg_lock ҷадвали системаест, ки ба мо мегӯяд, ки кадом қулфҳо дар Postgres ҳоло истифода мешаванд.
Аммо, барои ман худ ба шумо нишон додани pg_lock хеле душвор аст, зеро он хеле мураккаб аст. Ҳамин тавр, ман манзараеро сохтам, ки pg_locks -ро нишон медиҳад. Ва он инчунин барои ман коре мекунад, ки ба ман имкон медиҳад, ки беҳтар фаҳмам. Яъне, он қуфлҳои ман, сессияи шахсии ман ва ғайраҳоро истисно мекунад. Ин танҳо SQL-и стандартист ва он ба шумо имкон медиҳад, ки ба шумо чӣ рӯй дода истодааст, беҳтар нишон диҳед.
Мушкилоти дигар ин аст, ки ин манзара хеле васеъ аст, бинобар ин ман бояд як дуюм - lockview2 эҷод кунам.
Ва он ба ман сутунҳои бештарро аз ҷадвал нишон медиҳад. Ва дигаре, ки ба ман сутунҳои боқимондаро нишон медиҳад. Ин хеле мураккаб аст, бинобар ин ман кӯшиш кардам, ки онро то ҳадди имкон содда пешниҳод кунам.
Ҳамин тавр, мо ҷадвалеро бо номи Lockdemo сохтем. Ва мо дар он ҷо як хат ташкил кардем. Ин ҷадвали намунавии мост. Ва мо танҳо барои нишон додани намунаҳои қуфлҳо бахшҳо эҷод мекунем.
Пас, як сатр, як сутун. Навъи якуми қулф ACCESS SHARE номида мешавад. Ин маҳдудияти камтарин маҳдудкунанда аст. Ин маънои онро дорад, ки он амалан бо қуфлҳои дигар мухолифат намекунад.
Ва агар мо хоҳем, ки қулфро ба таври возеҳ муайян кунем, мо фармони "мизи қулф" -ро иҷро мекунем. Ва он бешубҳа блок хоҳад кард, яъне дар ҳолати ACCESS SHARE мо ҷадвали қулфро оғоз мекунем. Ва агар ман PSQL-ро дар замина иҷро кунам, пас ман сессияи дуюмро аз сессияи аввалини худ ҳамин тавр оғоз мекунам. Яъне, ман дар ин ҷо чӣ кор мекунам? Ман ба сессияи дигар меравам ва ба он мегӯям, ки "ба ман намуди қулфи ин дархостро нишон диҳед." Ва дар ин ҷо ман дар ин ҷадвал AccessShareLock дорам. Ин маҳз ҳамон чизест, ки ман дархост кардам. Ва мегуяд, ки блок таъин шудааст. Хеле содда.
Илова бар ин, агар мо ба сутуни дуюм назар кунем, пас дар он ҷо ҳеҷ чиз нест. Онҳо холӣ ҳастанд.
Ва агар ман фармони "SELECT" -ро иҷро кунам, пас ин роҳи ғайримуқаррарии дархости AccessShareLock аст. Ҳамин тавр, ман ҷадвали худро озод мекунам ва дархостро иҷро мекунам ва дархост сатрҳои сершуморро бармегардонад. Ва дар яке аз сатрҳо мо AccessShareLock-ро мебинем. Ҳамин тариқ, SELECT AccessShareLock-ро дар ҷадвал даъват мекунад. Ва он бо ҳеҷ чиз мухолифат намекунад, зеро он қулфи сатҳи паст аст.
Чӣ мешавад, агар ман SELECT-ро иҷро кунам ва се ҷадвали гуногун дошта бошам? Пештар ман танҳо як ҷадвалро иҷро мекардам, ҳоло ман се мизро иҷро мекунам: pg_class, pg_namespace ва pg_attribute.
Ва ҳоло вақте ки ман ба дархост назар мекунам, ман 9 AccessShareLocks-ро дар се ҷадвал мебинам. Чаро? Се ҷадвал бо ранги кабуд таъкид шудааст: pg_attribute, pg_class, pg_namespace. Аммо шумо инчунин метавонед бубинед, ки ҳамаи индексҳо, ки тавассути ин ҷадвалҳо муайян карда мешаванд, AccessShareLock низ доранд.
Ва ин як қулфест, ки амалан бо дигарон мухолифат намекунад. Ва ин танҳо он аст, ки мо ҳангоми интихоби он ҷадвалро аз нав танзим кунем. Ин маъно дорад. Яъне, агар мо ҷадвалро интихоб кунем, он дар ҳамон лаҳза нопадид мешавад, пас ин нодуруст аст, ҳамин тавр AccessShare қулфи сатҳи паст аст, ки ба мо мегӯяд, ки "ҳангоми кор кардан ин ҷадвалро напартоед". Аслан, он чизест, ки вай мекунад.
ROW SHARE - Ин қулф каме фарқ мекунад.
Биёед мисолро гирем. SELECT ROW SHARE усули бастани ҳар як сатрро алоҳида. Бо ин роҳ ҳеҷ кас наметавонад онҳоро нест кунад ё тағир диҳад, вақте ки мо онҳоро тамошо мекунем.
Пас, SHARE LOCK чӣ кор мекунад? Мо мебинем, ки ID транзаксия 681 барои SELECT аст. Ва ин ҷолиб аст. Дар ин ҷо чӣ шуд? Бори аввал мо рақамро дар майдони "Қулф" мебинем. Мо ID транзаксияро мегирем ва он мегӯяд, ки он дар реҷаи истисноӣ онро манъ мекунад. Ҳама чиз ин аст, ки мегӯяд, ки ман як сатр дорам, ки дар ҷое дар ҷадвал маҳкам аст. Аммо ӯ дақиқ намегӯяд, ки дар куҷост. Мо инро каме баъдтар муфассалтар дида мебароем.
Дар ин ҷо мо мегӯем, ки қулф аз ҷониби мо истифода мешавад.
Ҳамин тавр, қулфи истисноӣ ба таври возеҳ мегӯяд, ки он истисноӣ аст. Ва инчунин, агар шумо як сатри ин ҷадвалро нест кунед, он гоҳ чӣ тавре ки шумо мебинед, рӯй медиҳад.
SHARE EXCLUSIVE як қулфи дарозтар аст.
Ин фармони анализатори (ТАҲЛИЛИ) аст, ки истифода мешавад.
ҚУЛФИ SHARE - шумо метавонед ба таври возеҳ дар ҳолати мубодила қулф кунед.
Шумо инчунин метавонед индекси беназир эҷод кунед. Ва дар он ҷо шумо метавонед SHARE LOCK-ро бинед, ки қисми онҳост. Ва он мизро қуфл мекунад ва ба он як SHARE LOCK мегузорад.
Бо нобаёнӣ, SHARE LOCK дар ҷадвал маънои онро дорад, ки одамони дигар ҷадвалро хонда метавонанд, аммо ҳеҷ кас наметавонад онро тағир диҳад. Ва ин маҳз ҳамон чизест, ки шумо як шохиси беназирро эҷод мекунед.
Агар ман як индекси беназири ҳамзамон эҷод кунам, ман намуди дигари қулф хоҳам дошт, зеро тавре ки шумо дар ёд доред, истифодаи индексҳои ҳамзамон талаботи қулфкуниро кам мекунад. Ва агар ман қулфи муқаррарӣ, индекси муқаррариро истифода барам, пас ман аз навиштан ба индекси ҷадвал ҳангоми сохтани он пешгирӣ мекунам. Агар ман индекси ҳамзамон истифода барам, пас ман бояд намуди дигари қулфро истифода барам.
SHARE ROW EXCLUSIVE - боз он метавонад ба таври возеҳ муқаррар карда шавад (равшан).
Ё мо метавонем қоида эҷод кунем, яъне як ҳолати мушаххасеро гирем, ки дар он он истифода мешавад.
Қулфкунии ИСТИСНОИИ маънои онро дорад, ки ҳеҷ каси дигар наметавонад ҷадвалро иваз кунад.
Дар ин ҷо мо намудҳои гуногуни қулфҳоро мебинем.
Масалан, ACCESS EXCLUSIVE як фармони бастани аст. Масалан, агар шумо CLUSTER table
, он гоҳ ин маънои онро дорад, ки ҳеҷ кас дар он ҷо навишта наметавонад. Ва он на танҳо худи ҷадвал, балки индексҳоро низ қуфл мекунад.
Ин саҳифаи дуюми блоккунии ACCESS EXCLUSIVE мебошад, ки дар он мо мебинем, ки маҳз он чиро дар ҷадвал блок мекунад. Он сатрҳои ҷадвали алоҳидаро қулф мекунад, ки ин хеле ҷолиб аст.
Ин ҳама маълумоти асосӣест, ки ман мехостам бидиҳам. Мо дар бораи қулфҳо, дар бораи ID-ҳои транзаксия, мо дар бораи ID-ҳои транзаксияҳои виртуалӣ, дар бораи ID-ҳои доимии транзаксия сӯҳбат кардем.
Ва ҳоло мо якчанд мисолҳои блокро меомӯзем. Ин қисми ҷолибтарин аст. Мо ҳолатҳои хеле ҷолибро дида мебароем. Ва ҳадафи ман дар ин муаррифӣ он аст, ки ба шумо фаҳмиши беҳтаре дар бораи он, ки Postgres воқеан ҳангоми кӯшиши бастани чизҳои муайян чӣ кор мекунад. Ман фикр мекунам, ки вай дар бастани қисмҳо хеле хуб аст.
Биёед якчанд мисоли мушаххасро дида бароем.
Мо бо ҷадвалҳо ва як қатор дар ҷадвал оғоз мекунем. Вақте ки ман чизеро ворид мекунам, ман ExclusiveLock, ID Transaction ва ExclusiveLock дар ҷадвал нишон дода мешаванд.
Агар ман ду сатри дигар гузорам, чӣ мешавад? Ва ҳоло мизи мо се қатор дорад. Ва ман як сатр ворид кардам ва инро ҳамчун натиҷа гирифтам. Ва агар ман ду қатори дигар гузорам, ин чӣ аҷиб аст? Дар ин ҷо як чизи аҷибе вуҷуд дорад, зеро ман ба ин ҷадвал се сатр илова кардам, аммо ман дар ҷадвали қулф ду сатр дорам. Ва ин аслан рафтори асосии Postgres аст.
Бисёр одамон фикр мекунанд, ки агар шумо дар пойгоҳи додаҳо 100 сатрро қулф кунед, пас шумо бояд 100 вурудоти қулфро эҷод кунед. Агар ман якбора 1 сатрро маҳкам кунам, пас ба ман 000 чунин дархост лозим мешавад. Ва агар ба ман як миллион ё миллиард лозим бошад, то баста шавад. Аммо агар мо ин корро кунем, он чандон хуб кор намекунад. Агар шумо системаеро истифода карда бошед, ки барои ҳар як сатри инфиродӣ сабтҳои блокро эҷод мекунад, пас шумо мебинед, ки ин мушкил аст. Азбаски шумо бояд фавран ҷадвали қулфро муайян кунед, ки метавонад пур шавад, аммо Postgres ин корро намекунад.
Ва он чизе, ки дар ин слайд воқеан муҳим аст, он аст, ки он ба таври возеҳ нишон медиҳад, ки системаи дигаре вуҷуд дорад, ки дар дохили MVCC кор мекунад, ки сатрҳои алоҳидаро қуфл мекунад. Ҳамин тавр, вақте ки шумо миллиардҳо сатрҳоро қулф мекунед, Postgres як миллиард фармонҳои алоҳидаи қулфкуниро эҷод намекунад. Ва ин ба хосилнокии мехнат таъсири хеле хуб мерасонад.
Дар бораи навсозӣ чӣ гуфтан мумкин аст? Ман ҳоло сатрро нав карда истодаам ва шумо мебинед, ки он якбора ду амалиёти гуногунро иҷро кардааст. Он дар як вақт мизро қуфл мекард, аммо индексро низ бастааст. Ва ӯ бояд индексро маҳкам кунад, зеро дар ин ҷадвал маҳдудиятҳои беназир мавҷуданд. Ва мо мехоҳем боварӣ ҳосил кунем, ки ҳеҷ кас онро тағир намедиҳад, бинобар ин мо онро манъ мекунем.
Агар ман мехоҳам ду сатрро навсозӣ кунам, чӣ мешавад? Ва мо мебинем, ки ӯ низ ҳамин тавр рафтор мекунад. Мо ду маротиба зиёдтар навсозӣ мекунем, аммо маҳз ҳамон шумораи хатҳои қулф.
Агар шумо дар ҳайрат бошед, ки чӣ тавр Postgres ин корро мекунад, ба шумо лозим меояд, ки гуфтугӯҳои маро дар MVCC гӯш кунед, то бифаҳмед, ки Postgres ин сатрҳоро дар дохили он тағир медиҳад. Ва Postgres як роҳе дорад, ки ин корро мекунад, аммо онро дар сатҳи қулфкунии ҷадвал иҷро намекунад, онро дар сатҳи пасттар ва муассиртар мекунад.
Чӣ мешавад, агар ман мехоҳам чизеро нест кунам? Агар ман, масалан, як сатрро нест кунам ва ман то ҳол ду вуруди бастани худро дорам ва ҳатто агар ман мехоҳам ҳамаи онҳоро нест кунам, онҳо ҳанӯз дар он ҷо ҳастанд.
Ва, масалан, ман мехоҳам, ки 1 сатр ворид кунам ва баъд 000 сатрро нест кунам ё илова кунам, пас он сатрҳои алоҳидае, ки ман илова мекунам ё тағир медиҳам, онҳо дар ин ҷо сабт намешаванд. Онҳо дар сатҳи поёнтар дар худи силсила навишта шудаанд. Ва дар рафти нутки MVCC ман дар ин бора муфассал сухан рондам. Аммо вақте ки шумо қуфлҳоро таҳлил мекунед, хеле муҳим аст, то боварӣ ҳосил кунед, ки шумо дар сатҳи ҷадвал қулф карда истодаед ва намебинед, ки сатрҳои инфиродӣ дар ин ҷо чӣ гуна сабт карда мешаванд.
Дар бораи бастани ошкоро чӣ гуфтан мумкин аст?
Агар ман навсозӣ -ро пахш кунам, ман ду сатр баста мешавам. Ва агар ман ҳамаи онҳоро интихоб кунам ва "дар ҳама ҷо навсозӣ" -ро клик кунам, пас ман то ҳол ду сабти басташавӣ дорам.
Мо барои ҳар як сатри алоҳида сабтҳои алоҳида эҷод намекунем. Азбаски он вақт ҳосилнокӣ коҳиш меёбад, метавонад аз ҳад зиёд бошад. Ва мо метавонем худро дар вазъияти ногувор пайдо кунем.
Ва ҳамон чизест, ки агар мо мубодила кунем, мо метавонем ҳамаашро 30 маротиба иҷро кунем.
Мо ҷадвали худро барқарор мекунем, ҳама чизро нест мекунем ва сипас як сатрро дубора ворид мекунем.
Рафтори дигаре, ки шумо дар Postgres мебинед, ки рафтори хеле хуб маълум ва дилхоҳ аст, ки шумо метавонед навсозӣ ё интихоб кунед. Ва шумо метавонед ин корро ҳамзамон иҷро кунед. Ва интихоб навсозӣ ва ҳамон чизеро дар самти муқобил манъ намекунад. Мо ба хонанда мегӯем, ки нависандаро набандад, нависанда ҳам пеши хонандаро нагирифтааст.
Ман ба шумо як мисоли инро нишон медиҳам. Ман ҳоло интихоб хоҳам кард. Пас мо INSERT-ро иҷро мекунем. Ва он гоҳ шумо метавонед бубинед - 694. Шумо метавонед ID-и транзаксияро, ки ин воридкуниро анҷом додааст, бубинед. Ва ин тавр кор мекунад.
Ва агар ман ҳоло ба ID-и пуштибонии худ нигоҳ кунам, он ҳоло 695 аст.
Ва ман дар ҷадвали ман 695-ро мебинам.
Ва агар ман дар ин ҷо чунин навсозӣ кунам, пас ман парвандаи дигар мегирам. Дар ин ҳолат, 695 қулфи истисноӣ аст ва навсозӣ ҳамон рафтор дорад, аммо дар байни онҳо ихтилоф вуҷуд надорад, ки ин хеле ғайриоддӣ аст.
Ва шумо мебинед, ки дар боло он ShareLock аст ва дар поёни он ExclusiveLock аст. Ва ҳарду транзаксия анҷом ёфт.
Ва шумо бояд сӯҳбати маро дар MVCC гӯш кунед, то бифаҳмед, ки ин чӣ гуна рӯй медиҳад. Аммо ин як мисолест, ки шумо метавонед онро дар як вақт иҷро кунед, яъне дар як вақт SELECT ва UPDATE иҷро кунед.
Биёед дубора барқарор кунем ва як амалиёти дигарро анҷом диҳем.
Агар шумо кӯшиш кунед, ки ду навсозиро ҳамзамон дар як сатр иҷро кунед, он баста мешавад. Ва дар хотир доред, ман гуфтам, ки хонанда пеши нависандаро намегирад ва нависанда пеши хонандаро намегирад, балки як нависанда нависандаи дигарро мебандад. Яъне мо наметавонем ду нафарро дар як сатр навсозӣ кунем. Шумо бояд интизор шавед, ки яке аз онҳо тамом шавад.
Ва барои нишон додани ин, ман ба ҷадвали Lockdemo назар мекунам. Ва мо як сатрро дида мебароем. Барои як транзаксия 698.
Мо инро ба 2 навсозӣ кардем. 699 навсозии аввалин аст. Ва он бомуваффақият буд ё он дар амалиёти интизорӣ қарор дорад ва интизор аст, ки мо тасдиқ ё бекор кунем.
Аммо ба чизи дигар нигаред - 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 ҳастем, ки амалиёти худро анҷом диҳад.
Ва дар lock_type, tuple шумо рақамҳоро мебинед.
Шумо мебинед, ки он 0/10 аст. Ва ин рақами саҳифа ва инчунин ҷуброни ин сатри мушаххас аст.
Ва шумо мебинед, вақте ки мо навсозӣ мекунем, он 0/11 мешавад.
Аммо дар асл 0/10 аст, зеро интизори ин амалиёт вуҷуд дорад. Мо имконият дорем, ки бубинем, ки ин силсилаест, ки ман интизори тасдиқи он ҳастам.
Пас аз он ки мо онро тасдиқ кардем ва ӯҳдадориро пахш кардем ва вақте ки навсозӣ ба итмом мерасад, ин он чизест, ки мо боз ба даст меорем. Муомилоти 700 ягона қулф аст, он каси дигарро интизор нест, зеро он содир шудааст. Он танҳо интизори анҷоми транзаксия аст. Вақте ки 699 тамом мешавад, мо дигар чизеро интизор намешавем. Ва ҳоло транзаксияи 700 мегӯяд, ки ҳама чиз хуб аст ва он дорои ҳама қулфҳои зарурӣ дар ҳама ҷадвалҳои иҷозатдодашуда аст.
Ва барои боз ҳам мураккабтар кардани ин ҳама, мо назари дигареро эҷод мекунем, ки ин дафъа ба мо иерархияро фароҳам меорад. Ман интизор нестам, ки шумо ин дархостро мефаҳмед. Аммо ин ба мо дар бораи он чизе, ки рӯй дода истодааст, равшантар медиҳад.
Ин намуди рекурсивӣ аст, ки бахши дигар низ дорад. Ва он гоҳ ҳама чизро дубора ба ҳам меорад. Биёед инро истифода барем.
Чӣ мешавад, агар мо дар як вақт се навсозӣ кунем ва бигӯем, ки сатр ҳоло се аст. Ва мо аз 3 ба 4 иваз мекунем.
Ва дар ин ҷо мо мебинем 4. Ва транзаксия ID 702.
Ва он гоҳ ман аз 4 ба 5 иваз мекунам. Ва 5 ба 6 ва 6 ба 7. Ва ман як қатор одамонеро, ки мунтазири анҷоми ин як транзаксия хоҳанд буд.
Ва ҳама чиз равшан мешавад. Сатри аввал чист? Ин 702 аст. Ин ID транзаксияест, ки дар аввал ин арзишро муқаррар кардааст. Дар сутуни додаи ман чӣ навишта шудааст? Ман нишонаҳо дорам f
. Инҳо навсозиҳои ман ҳастанд, ки (5, 6, 7) тасдиқ карда намешаванд, зеро мо интизори анҷоми транзаксияи ID 702 ҳастем. Дар он ҷо мо блоки ID транзаксия дорем. Ва ин боиси 5 қулфҳои ID транзаксия мегардад.
Ва агар шумо ба 704 нигаред, дар 705, дар он ҷо то ҳол чизе навишта нашудааст, зеро онҳо ҳанӯз намедонанд, ки чӣ рӯй дода истодааст. Онҳо танҳо менависанд, ки намедонанд, ки чӣ рӯй дода истодааст. Ва онҳо танҳо ба хоб мераванд, зеро онҳо интизоранд, ки касе тамом шавад ва вақте ки имкони иваз кардани сатрҳо вуҷуд дорад, бедор шавад.
Чунин ба назар мерасад. Маълум аст, ки ҳама интизори навбати 12 мебошанд.
Ин аст он чизе ки мо дар ин ҷо дидем. Ин аст 0/12.
Пас, вақте ки транзаксияи аввал тасдиқ карда мешавад, шумо метавонед дар ин ҷо бинед, ки иерархия чӣ гуна кор мекунад. Ва акнун ҳама чиз равшан мешавад. Ҳамаашон пок мешаванд. Ва онҳо воқеан ҳанӯз интизоранд.
Ин аст он чизе ки рӯй дода истодааст. 702 ухдадор шудааст. Ва ҳоло 703 ин қулфи сатрро мегирад ва сипас 704 интизори 703-ро иҷро мекунад. Ва 705 низ инро интизор аст. Ва ҳангоме ки ҳамаи ин анҷом мешавад, онҳо худро тоза мекунанд. Ва ман мехоҳам қайд намоям, ки ҳама дар саф истодаанд. Ва ин ба вазъияте, ки ҳама дар интизори мошини аввал ҳастанд, хеле монанд аст. Мошини аввал меистад ва ҳама дар як қатори дароз меистанд. Он гоҳ вай ҳаракат мекунад, пас мошини навбатӣ метавонад пеш равад ва блоки худро гирад ва ғайра.
Ва агар ин барои шумо ба қадри кофӣ мураккаб набошад, мо ҳоло бо шумо дар бораи бунбастҳо сӯҳбат хоҳем кард. Ман намедонам, ки кадоме аз шумо ба онҳо дучор шудаед. Ин як мушкилоти хеле маъмул дар системаҳои пойгоҳи додаҳост. Аммо бунбастҳо вақтест, ки як ҷаласа интизори як ҷаласаи дигар аст, то коре кунад. Ва дар айни замон сессияи дигар интизори сессияи якум аст, ки коре кунад.
Ва, масалан, агар Иван гӯяд: "Ба ман чизе деҳ" ва ман мегӯям: "Не, ман онро ба шумо медиҳам, агар шумо ба ман чизи дигаре диҳед." Ва мегӯяд: «Не, агар ба ман надиҳӣ, ман онро ба ту намедиҳам». Ва мо ба вазъияти бунбаст дучор мешавем. Боварй дорам, ки Иван ин корро намекунад, вале шумо ин маъноро мефахмед, ки мо ду нафаре дорем, ки чизе гирифтан мехоханд ва онхо тайёр нестанд, ки касе чизеро ба онхо дихад. Ва ҳеҷ ҳалли нест.
Ва аслан, базаи шумо бояд инро ошкор кунад. Ва он гоҳ шумо бояд яке аз сессияҳоро нест кунед ё пӯшед, зеро дар акси ҳол онҳо то абад дар он ҷо хоҳанд монд. Ва мо онро дар пойгоҳи додаҳо мебинем, мо онро дар системаҳои оператсионӣ мебинем. Ва дар ҳама ҷойҳое, ки мо равандҳои мувозӣ дорем, ин метавонад рӯй диҳад.
Ва акнун мо ду блокро насб мекунем. Мо 50 ва 80 мегузорем. Дар сатри аввал ман аз 50 то 50 навсозӣ мекунам. Ман рақами транзаксияро мегирам 710.
Ва он гоҳ ман 80 ба 81 ва 50 ба 51 иваз мекунам.
Ва ин аст, ки он чӣ гуна хоҳад буд. Ҳамин тавр, 710 як қатор баста шудааст ва 711 интизори тасдиқ аст. Мо инро ҳангоми навсозӣ дидем. 710 соҳиби силсилаи мост. Ва 711 интизор аст, ки 710 транзаксияро анҷом диҳад.
Ва ҳатто мегӯяд, ки бунбастҳо дар кадом сатр рух медиҳанд. Ва ин ҷост, ки он аҷиб ба даст меояд.
Ҳоло мо аз 80 то 80 навсозӣ мекунем.
Ва ин аст, ки бунбастҳо оғоз мешаванд. 710 мунтазири посух аз 711 аст ва 711 мунтазири 710. Ва ин кор хуб нест. Ва ҳеҷ роҳе аз ин вуҷуд надорад. Ва онҳо аз ҳамдигар посух интизоранд.
Ва он танҳо ба таъхир ҳама чизро оғоз мекунад. Ва мо инро намехоҳем.
Ва Postgres дорои роҳҳои пайхас кардани ин ҳодиса мебошад. Ва вақте ки ин рӯй медиҳад, шумо ин хатогиро мегиред. Ва аз ин маълум мешавад, ки фалон раванд интизори SHARE LOCK аз раванди дигар аст, яъне бо раванди 711 банд шудааст. Ва он раванд интизори дода шудани SHARE LOCK дар ID фалон транзаксия буд ва бо фалон раванд баста шуд. Бинобар ин дар ин чо вазъияти бунбаст ба амал омадааст.
Оё бунбасти сетарафа вуҷуд дорад? Мумкин ки? Бале.
Мо ин рақамҳоро ба ҷадвал дохил мекунем. Мо 40 ба 40 иваз мекунем, блок мекунем.
Мо 60-ро ба 61, 80-ро ба 81 иваз мекунем.
Ва он гоҳ мо 80-ро иваз мекунем ва сипас бум!
Ва 714 ҳоло интизори 715 аст. 716-ум 715-умро интизор аст. Ва дар ин бора чизе кардан мумкин нест.
Дар ин ҷо дигар ду нафар нест, аллакай се нафар ҳастанд. Ман аз ту чизе мехоҳам, ин кас аз шахси сеюм чизе мехоҳад ва сеюмӣ аз ман чизе мехоҳад. Ва мо интизори сетарафа мешавем, зеро ҳама интизори онем, ки шахси дигар кореро, ки бояд анҷом диҳад, анҷом диҳад.
Ва Postgres медонад, ки ин дар кадом сатр рух медиҳад. Ва аз ин рӯ, он ба шумо паёми зеринро медиҳад, ки нишон медиҳад, ки шумо мушкилоте доред, ки се вуруд ба ҳамдигар монеъ мешаванд. Ва дар ин ҷо ягон маҳдудият вуҷуд надорад. Ин метавонад дар ҳолате бошад, ки 20 вуруд якдигарро манъ мекунанд.
Мушкилоти навбатӣ сериализатсияшаванда аст.
Агар қулфи махсуси serializable.
Ва мо ба 719 бармегардем. Баромади он комилан муқаррарӣ аст.
Ва шумо метавонед клик кунед, то транзаксияро аз serializable анҷом диҳед.
Ва шумо мефаҳмед, ки шумо ҳоло як намуди дигари қулфи SA доред - ин маънои сериализатсияшавандаро дорад.
Ва аз ин рӯ, мо як навъи нави қулф бо номи SARieadLock дорем, ки қулфи силсилавӣ аст ва ба шумо имкон медиҳад, ки сериалҳоро ворид кунед.
Ва инчунин шумо метавонед индексҳои беназир дохил кунед.
Дар ин ҷадвал мо индексҳои беназир дорем.
Пас, агар ман рақами 2-ро дар ин ҷо гузорам, пас ман 2 дорам. Аммо дар боло, ман 2-и дигарро гузоштам. Ва шумо мебинед, ки 721 қулфи истисноӣ дорад. Аммо ҳоло 722 мунтазири анҷоми амалиёти 721 аст, зеро он наметавонад 2-ро ворид кунад, то он даме, ки бо 721 чӣ рӯй медиҳад.
Ва агар мо субтрансдия кунем.
Дар ин ҷо мо 723 дорем.
Ва агар мо нуқтаро захира кунем ва онро навсозӣ кунем, пас мо ID-и нави транзаксия мегирем. Ин як намунаи дигари рафторест, ки шумо бояд аз он огоҳ бошед. Агар мо инро баргардонем, пас ID транзаксия нест мешавад. 724 меравад. Аммо ҳоло мо 725 дорем.
Пас, ман дар ин ҷо чӣ кор карданӣ ҳастам? Ман кӯшиш мекунам ба шумо намунаҳои қулфҳои ғайриоддиеро, ки шумо метавонед пайдо кунед, нишон диҳам: хоҳ он қулфҳои сериализатсияшаванда бошад ё SAVEPOINT, инҳо намудҳои гуногуни қулфҳо мебошанд, ки дар ҷадвали қулф пайдо мешаванд.
Ин эҷоди қулфҳои возеҳ (возеҳ) мебошад, ки дорои pg_advisory_lock мебошанд.
Ва шумо мебинед, ки намуди блоккунӣ ҳамчун маслиҳат номбар шудааст. Ва дар ин ҷо бо сурх "маслиҳат" навишта шудааст. Ва шумо метавонед ҳамзамон бо pg_advisory_unlock маҳкам кунед.
Ва дар охир мехостам ба шумо як чизи дигарро нишон дихам. Ман як намуди дигар эҷод мекунам. Аммо ман ба ҷадвали pg_locks бо ҷадвали pg_stat_activity ҳамроҳ мешавам. Ва чаро ман мехоҳам ин корро кунам? Зеро ин ба ман имкон медиҳад, ки ҳама ҷаласаҳои ҷорӣро бубинам ва бубинам, ки маҳз чӣ гуна қулфҳоро интизоранд. Ва ин хеле ҷолиб аст, вақте ки мо ҷадвали қулф ва ҷадвали дархостро якҷоя мекунем.
Ва дар ин ҷо мо pg_stat_view эҷод мекунем.
Ва мо сатрро як ба як навсозӣ мекунем. Ва дар ин ҷо мо 724-ро мебинем. Ва он гоҳ мо сатри худро ба се навсозӣ мекунем. Ва шумо ҳоло дар ин ҷо чӣ мебинед? Инҳо дархостҳоянд, яъне шумо тамоми рӯйхати дархостҳоеро, ки дар сутуни чап номбар шудаанд, мебинед. Ва он гоҳ дар тарафи рост шумо метавонед блокҳо ва он чизеро, ки онҳо эҷод мекунанд, бубинед. Ва он метавонад барои шумо равшантар бошад, то шумо набояд ҳар дафъа ба ҳар як ҷаласа баргардед ва бубинед, ки оё шумо бояд ба он ҳамроҳ шавед ё не. Онҳо ин корро барои мо мекунанд.
Хусусияти дигаре, ки хеле муфид аст pg_blocking_pids
. Шумо шояд ҳеҷ гоҳ дар бораи вай нашунидаед. Вай чӣ кор мекунад? Он ба мо имкон медиҳад бигӯем, ки барои ин ҷаласа 11740 кадом ID-ҳои мушаххаси равандро интизор аст. Ва шумо мебинед, ки 11740 интизори 724 аст. Ва 724 дар боло аст. Ва 11306 ID раванди шумост. Аслан, ин функсия аз ҷадвали қулфи шумо мегузарад. Ва ман медонам, ки ин каме мураккаб аст, аммо шумо онро фаҳмида метавонед. Аслан ин функсия аз ин ҷадвали қулф мегузарад ва мекӯшад пайдо кунад, ки дар куҷо ин ID раванд қуфлҳоеро, ки интизоранд, дода мешавад. Ва он инчунин кӯшиш мекунад, ки муайян кунад, ки кадом ID протсесси раванде, ки қулфро интизор аст, дорад. Пас шумо метавонед ин функсияро иҷро кунед pg_blocking_pids
.
Ва ин метавонад хеле муфид бошад. Мо инро танҳо дар версияи 9.6 илова кардем, бинобар ин ин хусусият ҳамагӣ 5 сол аст, аммо он хеле ва хеле муфид аст. Ва ҳамин чиз ба дархости дуюм дахл дорад. Он маҳз он чизеро, ки мо бояд бубинем, нишон медиҳад.
Ин аст он чизе ки ман мехостам бо шумо дар бораи он сӯҳбат кунам. Ва тавре ки ман интизор будам, мо тамоми вақти худро сарф мекардем, зеро слайдҳо хеле зиёд буданд. Ва слайдҳо барои зеркашӣ дастрасанд. Ман мехоҳам ба шумо барои дар ин ҷо буданатон ташаккур гӯям. Боварӣ дорам, ки аз конфронс баҳра хоҳед бурд, ташаккури зиёд!
саволҳои:
Масалан, агар ман кӯшиш мекунам, ки сатрҳоро навсозӣ кунам ва сеанси дуюм кӯшиш кунад, ки тамоми ҷадвалро нест кунад. То ҷое ки ман мефаҳмам, бояд чизе монанди қулфи ният бошад. Оё дар Postgres чунин чизе ҳаст?
Биёед ба ибтидои аввал баргардем. Шумо метавонед дар хотир доред, ки вақте ки шумо ягон кор мекунед, масалан ҳангоми SELECT, мо AccessShareLock-ро медиҳем. Ва ин аз афтидани ҷадвал пешгирӣ мекунад. Пас, агар шумо, масалан, хоҳед, ки сатри ҷадвалро навсозӣ кунед ё сатрро нест кунед, касе наметавонад дар як вақт тамоми ҷадвалро нест кунад, зеро шумо ин AccessShareLock-ро дар тамоми ҷадвал ва болои сатр нигоҳ медоред. Ва вақте ки шумо анҷом додед, онҳо метавонанд онро нест кунанд. Аммо вақте ки шумо дар он ҷо чизеро мустақиман тағир медиҳед, онҳо ин корро карда наметавонанд.
Биёед боз ин корро кунем. Биёед ба мисоли тозакунӣ гузарем. Ва шумо мебинед, ки чӣ гуна қулфи истисноӣ дар сатри болои тамоми ҷадвал мавҷуд аст.
Ин ба монанди қулфи истисноӣ хоҳад буд, дуруст?
Бале, ба назар чунин мерасад. Ман мефаҳмам, ки шумо дар бораи чӣ мегӯед. Шумо мегӯед, ки агар ман SELECT -ро анҷом диҳам, ман ShareExclusive дорам ва баъд онро Row Exclusive месозам, оё ин мушкилот мешавад? Аммо тааҷҷубовар аст, ки ин мушкилот ба вуҷуд намеорад. Чунин ба назар мерасад, ки дараҷаи қулф баланд мешавад, аммо аслан ман қулф дорам, ки ҳазф карданро пешгирӣ мекунад. Ва ҳоло, вақте ки ман ин қулфро пурқувваттар мегардонам, он ҳанӯз ҳам ҳазф карданро пешгирӣ мекунад. Аз ин рӯ, ман боло намеравам. Яъне, вақте ки он дар сатҳи поёнтар буд, аз рӯй додани он пешгирӣ кард, бинобар ин вақте ки ман сатҳашро боло мекунам, он ҳанӯз ҳам аз нест кардани ҷадвал пешгирӣ мекунад.
Ман мефаҳмам, ки шумо дар бораи чӣ мегӯед. Дар ин ҷо ягон ҳолати таҳаввулоти қулф вуҷуд надорад, ки дар он шумо кӯшиш мекунед, ки як қулфро аз як қулф гузошта, қуфлро қавитар ҷорӣ кунед. Дар ин ҷо он танҳо ин пешгириро дар саросари тахта зиёд мекунад, бинобар ин он ягон ихтилофро ба вуҷуд намеорад. Аммо саволи хуб аст. Ташаккури зиёд барои пурсидани ин!
Вақте ки мо сеансҳои зиёд, шумораи зиёди корбарон дорем, мо бояд чӣ кор кунем, то аз вазъияти бунбаст нагирем?
Postgres ба таври худкор ҳолатҳои сарбастаро пай мебарад. Ва он ба таври худкор яке аз сессияҳоро нест мекунад. Ягона роҳи пешгирӣ кардани блоки мурда ин бастани одамон бо ҳамон тартиб аст. Пас, вақте ки шумо ба аризаи худ назар мекунед, аксар вақт сабаби бунбастҳо ... Биёед тасаввур кунем, ки ман мехоҳам ду чизи гуногунро маҳкам кунам. Як барнома ҷадвали 1-ро қуфл мекунад ва барномаи дигар 2 ва сипас ҷадвали 1-ро қуфл мекунад. Ва роҳи осонтарини пешгирӣ аз бунбаст ин назар кардан ба замимаи шумо ва кӯшиш кунед, ки қулфкунӣ бо як тартиб дар тамоми барномаҳо сурат мегирад. Ва ин одатан 80% мушкилотро бартараф мекунад, зеро ҳама намуди одамон ин барномаҳоро менависанд. Ва агар шумо онҳоро бо ҳамон тартиб масдуд кунед, пас шумо ба вазъияти сарбаста дучор намешавед.
Ташаккури зиёд барои иҷрои шумо! Шумо дар бораи пур аз вакуум гап задед ва агар ман дуруст фаҳмам, пур аз вакуум тартиби сабтҳоро дар нигаҳдории алоҳида вайрон мекунад, бинобар ин онҳо сабтҳои ҷориро бетағйир нигоҳ медоранд. Чаро пур аз вакуум дастрасии истисноии қулфро мегирад ва чаро он бо амалиёти навиштан мухолифат мекунад?
Ин саволи хуб аст. Сабаб дар он аст, ки чангкашак пур мизро мегирад. Ва мо аслан версияи нави ҷадвалро эҷод карда истодаем. Ва миз нав хоҳад буд. Маълум мешавад, ки ин версияи комилан нави ҷадвал хоҳад буд. Ва мушкилот дар он аст, ки вақте ки мо ин корро мекунем, мо намехоҳем, ки одамон онро хонанд, зеро мо бояд ҷадвали навро бубинем. Ва ин ба саволи қаблӣ пайваст мешавад. Агар мо дар як вақт хонда метавонистем, онро ба ҷои дигар интиқол дода, одамонро ба мизи нав равона карда наметавонем. Мо бояд интизор шавем, ки ҳама хондани ин ҷадвалро тамом кунанд ва аз ин рӯ, он аслан як ҳолати истисноии қулф аст.
Мо танҳо мегӯем, ки мо аз аввал қулф мекунем, зеро мо медонем, ки дар ниҳоят ба мо қулфи истисноӣ лозим аст, то ҳама ба нусхаи нав интиқол дода шаванд. Ҳамин тавр, мо метавонем ин масъаларо ҳал кунем. Ва мо ин корро бо индексатсияи ҳамзамон иҷро мекунем. Аммо ин корро кардан хеле душвортар аст. Ва ин ба саволи қаблии шумо дар бораи қулфи истисноӣ алоқаманд аст.
Оё имкон аст, ки ба Postgres вақти қулфро илова кард? Дар Oracle, ман метавонам, масалан, "интихоб барои навсозӣ" нависед ва пеш аз навсозӣ 50 сония интизор шавед. Ин барои ариза хуб буд. Аммо дар Postgres, ба ман лозим аст, ки онро фавран иҷро кунам ва умуман интизор нашавам ё то чанд вақт интизор шавам.
Бале, шумо метавонед дар қуфлҳои худ, дар қуфлҳои худ як вақтро интихоб кунед. Шумо инчунин метавонед фармони бидуни роҳ бароред, ки он... агар шумо фавран қулфро гирифта натавонед. Аз ин рӯ, ё вақти қулф ё чизи дигаре, ки ба шумо имкон медиҳад, ки ин корро кунед. Ин дар сатҳи синтаксисӣ анҷом дода намешавад. Ин ҳамчун тағирёбанда дар сервер анҷом дода мешавад. Баъзан инро истифода бурдан мумкин нест.
Метавонед слайди 75-ро кушоед?
Бале.
Ва саволи ман ин аст. Чаро ҳарду равандҳои навсозӣ 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