Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Veguhastina axaftina Bruce Momjian ya sala 2020-an "Rêvekirina Gerînendeyê Girêdana Postgres".

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

(Têbînî: Hemî pirsên SQL yên ji slaytan dikarin ji vê lînkê werin wergirtin: http://momjian.us/main/writings/pgsql/locking.sql)

Slav! Pir xweş e ku dîsa li vir li Rûsyayê me. Bibore ku sala borî min nikarîbû werim, lê îsal planên min û Ivan hene. Ez hêvî dikim ku ez pir caran li vir bim. Ez ji hatina Rûsyayê hez dikim. Ez ê serdana Tyumen, Tver bikim. Ez pir kêfxweş im ku ez ê bikaribim serdana van bajaran bikim.

Navê min Bruce Momjian e. Ez li EnterpriseDB dixebitim û zêdetirî 23 sal in bi Postgres re dixebitim. Ez li Philadelphia, USA dijîm. Ez salê 90 rojan digerim. Û ez beşdarî 40 konferansan dibim. Ya min Web site, ku tê de slaytên ku ez ê niha nîşanî we bidim hene. Ji ber vê yekê, piştî konferansê hûn dikarin wan ji malpera min a kesane dakêşin. Di heman demê de nêzî 30 pêşkêşiyan jî dihewîne. Vîdyo û hejmareke mezin ji navnîşên blogê jî hene, ji 500 zêdetir. Ev çavkaniyek pir agahdar e. Û heke hûn bi vê materyalê re eleqedar in, wê hingê ez we vedixwînim ku hûn wê bikar bînin.

Berî ku ez bi Postgresê re dest bi xebatê bikim ez mamoste bûm, profesor bûm. Û ez pir kêfxweş im ku ez ê niha karibim tiştê ku ezê ji we re bêjim ji we re bibêjim. Ev yek ji pêşniyarên min ên herî balkêş e. Û ev pêşkêşî 110 slayd hene. Em ê bi tiştên hêsan dest bi axaftinê bikin, û di dawiyê de dê rapor her ku diçe tevlihevtir û tevlihevtir bibe.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ev sohbeteke pir ne xweş e. Astengkirin ne mijara herî populer e. Em dixwazin ev yek li cihekî winda bibe. Mîna çûyîna doktorê diranan e.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

  1. Girtin ji bo gelek kesên ku di databasan de dixebitin û di heman demê de gelek pêvajoyên wan dimeşin pirsgirêkek e. Pêdiviya wan bi astengkirinê heye. Ango îro ez ê zanyariyên bingehîn li ser astengkirinê bidim we.
  2. Nasnameyên danûstandinê. Ev beşek pir bêhêz a pêşkêşiyê ye, lê pêdivî ye ku ew werin fêm kirin.
  3. Piştre em ê li ser celebên astengkirinê biaxivin. Ev beşek pir mekanîkî ye.
  4. Û li jêr em ê çend mînakên astengkirinê bidin. Û têgihîştina wê pir dijwar be.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ka em behsa astengkirinê bikin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Termînolojiya me pir tevlihev e. Çend ji we dizanin ku ev beş ji ku tê? Du kes. Ev ji lîstikek bi navê Colossal Cave Adventure ye. Ez difikirim ku ew di salên 80-an de lîstikek komputer-based nivîsê bû. Li wir diviyabû ku tu biçûya şikeftekê, nav labîrentekê, û nivîs diguherî, lê naverok her carê hema hema yek bû. Bi vî awayî ev lîstik tê bîra min.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û li vir em navê qefleyên ku ji Oracle ji me re hatine, dibînin. Em wan bikar tînin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Li vir em şertên ku min tevlihev dikin dibînin. Mînakî, SHARE UPDATE ECXLUSIVE. Next SHARE RAW ECXLUSIVE. Bi rastî, ev nav ne pir zelal in. Em ê hewl bidin ku wan bi hûrgulî bifikirin. Di hinekan de peyva "parvekirin" heye, ku tê wateya veqetandin. Di hinekan de peyva "taybetî" heye. Hin ji van herdu peyvan hene. Ez dixwazim dest pê bikim ka van kilît çawa dixebitin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û peyva "gehiştin" jî pir girîng e. Û peyvên "rêz" rêzek in. Ango belavkirina gihîştinê, belavkirina rêzan.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Pirsgirêkek din a ku divê di Postgres de were fam kirin, ku mixabin ez ê nikaribim di axaftina xwe de vebêjim, MVCC ye. Li ser malpera min li ser vê mijarê pêşkêşiyek cûda heye. Û heke hûn difikirin ku ev pêşkêşî dijwar e, MVCC belkî herî dijwar e. Û heke hûn eleqedar in, hûn dikarin li ser malperê temaşe bikin. Hûn dikarin vîdyoyê temaşe bikin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Tiştek din ku divê em fam bikin nasnameyên danûstendinê ne. Gelek danûstandin bêyî nasnameyên yekta nikarin bixebitin. Û li vir me ravekirinek heye ku danûstendinek çi ye. Postgres du pergalên hejmartina danûstendinê hene. Ez dizanim ev ne çareseriyek pir xweş e.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Di heman demê de ji bîr mekin ku fêhmkirina slaytan dê pir dijwar be, ji ber vê yekê ya ku bi sor tê ronî kirin tiştê ku hûn hewce ne ku bala xwe bidinê ye.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

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

Ka em bibînin. Hejmara danûstendinê bi sor tê ronî kirin. Fonksiyona SELECT pg_back li vir tê xuyang kirin. Ew danûstendina min û nasnameya danûstendinê vedigerîne.

Tiştek din, heke hûn ji vê pêşkêşiyê hez dikin û dixwazin wê li ser databasa xwe bimeşînin, wê hingê hûn dikarin biçin vê lînkê bi rengê pembe û ji bo vê pêşkêşiyê SQL dakêşin. Û hûn dikarin bi hêsanî wê di PSQL-ya xwe de bimeşînin û tevahî pêşkêşî dê tavilê li ser ekrana we be. Ew ê kulîlk negire, lê bi kêmanî em dikarin wê bibînin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Di vê rewşê de em nasnameya danûstendinê dibînin. Ev hejmar e ku me jê re destnîşan kir. Û di Postgres de celebek din a nasnameya danûstendinê heye, ku jê re Nasnameya danûstendina virtual tê gotin

Û divê em vê fêm bikin. Ev pir girîng e, wekî din em ê nikaribin girtina li Postgres fam bikin.

Nasnameya danûstendina virtual nasnameyek danûstendinê ye ku nirxên domdar nagire. Mînakî, heke ez fermanek SELECT bimeşînim, wê hingê bi îhtîmalek mezin ez ê databasê neguherim, ez ê tiştek kilît nekim. Ji ber vê yekê dema ku em hilbijarkek hêsan dimeşînin, em wê danûstendinê nasnameyek domdar nadin. Em li wir tenê nasnameyek virtual didin wê.

Û ev performansa Postgres çêtir dike, kapasîteyên paqijkirinê çêtir dike, ji ber vê yekê nasnameya danûstendina virtual ji du hejmaran pêk tê. Hejmara yekem berî şiklê nasnameya paşverû ye. Û li milê rastê em tenê jimareyek dibînin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ji ber vê yekê, ger ez daxwazek bimeşînim, ew dibêje ku ID-ya paşîn 2 ye.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û heger ez rêzek danûstendinên weha bimeşînim, wê hingê em dibînin ku her gava ku ez pirsek dimeşînim jimarvan zêde dibe. Mînakî, gava ku ez pirsa 2/10, 2/11, 2/12, hwd.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Bînin bîra xwe ku li vir du stûn hene. Li milê çepê em nasnameya danûstendina virtual - 2/12 dibînin. Û li milê rastê me nasnameyek danûstendinê ya daîmî heye. Û ev qad vala ye. Û ev danûstendina databasê naguherîne. Ji ber vê yekê ez nasnameyek danûstendinê ya daîmî nadim.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Hema ku ez fermana analîzê ((ANALYZE) dimeşînim, heman pirsê nasnameyek danûstendinê ya domdar dide min. Binêrin ka ev ji bo me çawa hatiye guhertin. Berê ev nasnameya min tune bû, lê niha li cem min heye.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ji ber vê yekê li vir daxwazek din, danûstendinek din heye. Hejmara danûstendina virtual 2/13 e. Û heke ez ji bo nasnameya danûstendinê ya domdar bipirsim, wê hingê gava ku ez lêpirsînê bimeşînim, ez ê wê bistînim.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ji ber vê yekê, careke din. Nasnameyek danûstendinê ya virtual û nasnameyek danûstendinê ya domdar heye. Tenê vê xalê fêm bikin da ku tevgera Postgres fam bikin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Em diçin beşa sêyemîn. Li vir em ê bi hêsanî di nav cûrbecûr qefleyên Postgres de bimeşin. Pir ne balkêş e. Beşa dawî dê pir balkêştir be. Lê divê em tiştên bingehîn bihesibînin, ji ber ku wekî din em ê fam nekin ku dê paşê çi bibe.

Em ê di vê beşê re derbas bibin, em ê li her celebê kilît binêrin. Û ez ê mînakan nîşanî we bidim ka ew çawa têne saz kirin, ew çawa dixebitin, ez ê hin pirsan nîşanî we bidim ku hûn dikarin bikar bînin da ku bibînin ka girtina li Postgres çawa dixebite.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ji bo ku pirsek biafirînin û bibînin ka li Postgres çi diqewime, divê em pirsê di dîtina pergalê de derxînin. Di vê rewşê de, pg_lock bi sor tê ronî kirin. Pg_lock tabloyek pergalê ye ku ji me re vedibêje ka çi kilît niha li Postgres têne bikar anîn.

Lêbelê, ji min re pir dijwar e ku ez pg_lock bi serê xwe nîşanî we bidim ji ber ku ew pir tevlihev e. Ji ber vê yekê min dîmenek çêkir ku pg_locks nîşan dide. Û ew jî ji min re hin karan dike ku dihêle ku ez çêtir fam bikim. Ango, ew kilîdên min, danişîna min, hwd vedihewîne. Ew tenê SQL-ya standard e û dihêle hûn çêtir nîşanî we bidin ka çi diqewime.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Pirsgirêkek din jî ev e ku ev nêrîn pir berfireh e, ji ber vê yekê divê ez duyemîn biafirînim - lockview2.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian Û ew ji sifrê bêtir stûnan nîşanî min dide. Û ya din jî ku stûnên mayî nîşanî min dide. Ev pir tevlihev e, ji ber vê yekê min hewl da ku wê bi qasî ku gengaz pêşkêşî bikim.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ji ber vê yekê me tabloyek bi navê Lockdemo çêkir. Û me li wir yek rêzek çêkir. Ev tabloya nimûneya me ye. Û em ê beşan biafirînin ku tenê mînakên qefleyan nîşanî we bidin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ji ber vê yekê, yek rêz, yek stûn. Cûreya yekem a qefilandinê jê re ACCESS SHARE tê gotin. Ev astengkirina herî kêm sînordar e. Ev tê vê wateyê ku ew di pratîkê de bi qefleyên din re nakokî nake.

Û eger em bixwazin bi eşkere kilîtekê pênase bikin, em fermana "tabloya qefilandinê" dimeşînin. Û ew ê eşkere asteng bike, ango di moda ACCESS SHARE de em tabloya qefilandinê dest pê dikin. Û heke ez PSQL-ê di paşerojê de bimeşînim, wê hingê ez rûniştina duyemîn ji rûniştina xweya yekem bi vî rengî dest pê dikim. Yanî ez ê li vir çi bikim? Ez diçim danişînek din û jê re dibêjim "ji bo vê daxwazê ​​lockview nîşanî min bide." Û li vir min di vê tabloyê de AccessShareLock heye. Ya ku min daxwaz kir ev e. Û dibêje ku bloke hatiye tayînkirin. Pir sade.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Wekî din, heke em li stûna duyemîn binêrin, wê hingê tiştek li wir tune. Ew vala ne.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û heke ez fermana "SELECT" bimeşînim, wê hingê ev awayê nepenî (eşkere) ye ku daxwaza AccessShareLock bike. Ji ber vê yekê ez tabloya xwe berdidim û lêpirsînê dimeşînim û pirs gelek rêzan vedigerîne. Û di yek ji rêzan de em AccessShareLock dibînin. Bi vî rengî, SELECT li ser maseyê bangî AccessShareLock dike. Û ew bi rastî bi tiştek re nakokî nabe ji ber ku ew kilîtiyek nizm e.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ger ez SELECT bimeşînim û sê tabloyên cûda hebin? Berê min tenê tabloyek dixist, niha ez sêyan dixebitim: pg_class, pg_namespace û pg_attribute.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û naha gava ku ez li pirsê dinêrim, ez di sê tabloyan de 9 AccessShareLocks dibînim. Çima? Sê tablo bi şîn têne ronî kirin: pg_attribute, pg_class, pg_namespace. Lê hûn jî dikarin bibînin ku hemî navnîşên ku bi van tabloyan têne diyar kirin jî AccessShareLock hene.

Û ev qeflek e ku bi pratîkî bi yên din re nakokî nake. Tiştê ku ew dike ev e ku dema ku em wê hildibijêrin tenê rê li ber vesazkirina tabloyê digire. Aqil dike. Ango heke em tabloyek hilbijêrin, ew di wê gavê de winda dibe, hingê ev xelet e, lewra AccessShare kilîtkirinek nizm e ku ji me re dibêje "Dema ku ez dixebitim vê tabloyê bernedin". Di bingeh de, her tiştê ku ew dike ev e.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

PARVEKIRINA RÊZ - Ev kilît hinekî cûda ye.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Werin em mînakek bidin. Rêbaza PARVEKIRINA RÊZÊ HILBIJARTIN ku her rêzek ferdî girtî ye. Bi vî awayî dema ku em li wan temaşe dikin kes nikare wan jêbibe an biguherîne.

Vekirina Rêvebirê Lockê Postgres. Bruce MomjianJi ber vê yekê SHARE LOCK çi dike? Em dibînin ku nasnameya danûstendinê ji bo SELECT 681 e. Û ev balkêş e. Li vir çi qewimî? Cara yekem em hejmarê di qada "Lock" de dibînin. Em nasnameya danûstendinê digirin û ew dibêje ku ew di moda taybetî de asteng dike. Tiştê ku dike ev e ku dibêje rêzek min heye ku ji hêla teknîkî ve li cîhek tabloyê girtî ye. Lê ew bi rastî nabêje ku derê. Em ê hinekî paşê li ser vê yekê bi hûrgulî binêrin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Li vir em dibêjin ku kilît ji aliyê me ve tê bikaranîn.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ji ber vê yekê, kilîtek taybetî bi eşkere dibêje ku ew taybetî ye. Û her weha heke hûn rêzek di vê tabloyê de jêbikin, wê hingê ev tişt dê bibe, wekî ku hûn dibînin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

SHARE EXCLUSIVE qeflek dirêjtir e.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ev fermana analîzkerê (ANALYZE) ye ku dê were bikar anîn.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

SHARE LOCK - hûn dikarin bi eşkereyî di moda parvekirinê de kilît bikin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Her weha hûn dikarin navnîşek bêhempa biafirînin. Û li wir hûn dikarin SHARE LOCK, ku beşek ji wan e, bibînin. Û maseyê kilît dike û LOCK SHARE datîne ser.

Bi xwerû, SHARE LOCK li ser maseyê tê vê wateyê ku kesên din dikarin tabloyê bixwînin, lê kes nikare wê biguhezîne. Û ev tam ya ku diqewime dema ku hûn pêdekek bêhempa diafirînin.

Ger ez pêvek hevdemî yekta biafirînim, wê hingê ez ê celebek cûda girtina min hebe ji ber ku, wekî ku tê bîra we, karanîna hevdemî pêvek pêdiviya qefilandinê kêm dike. Û heke ez kilîtkirinek normal, pêdekek normal bikar bînim, wê hingê ez ê bi vî rengî pêşî li nivîsandina li ser navnîşa tabloyê dema ku ew tê afirandin asteng bikim. Ger ez pêvekek hevdem bikar bînim, wê hingê pêdivî ye ku ez celebek cûda girtinê bikar bînim.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

PARVEKIRINA RÊZÊ TAYBETÎ - dîsa ew dikare bi eşkereyî (eşkere) were danîn.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

An jî em dikarin qaîdeyek biafirînin, ango, rewşek taybetî ya ku ew ê tê de were bikar anîn bigirin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Girtina EXCLUSIVE tê vê wateyê ku kesek din nikare tabloyê biguhezîne.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Li vir em cûreyên cûda yên kilît dibînin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Mînakî, ACCESS EXCLUSIVE fermanek astengkirinê ye. Ji bo nimûne, eger hûn bikin CLUSTER table, wê demê ev tê wê wateyê ku dê kes nikaribe li wir binivîsîne. Û ew ne tenê tabloya xwe, lê di heman demê de navnîşan jî digire.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ev rûpela duyemîn a astengkirina ACCESS EXCLUSIVE ye, ku em tam dibînin ku ew di tabloyê de çi asteng dike. Ew rêzên tabloya kesane digire, ku pir balkêş e.

Ew hemî agahdariya bingehîn e ku min dixwest ez bidim. Me qala qefleyan kir, li ser nasnameyên danûstendinê, me li ser nasnameyên danûstendina virtual, li ser nasnameyên danûstendinê yên daîmî axivî.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û niha em ê çend mînakên astengkirinê derbas bikin. Ev beşa herî balkêş e. Em ê li dozên pir balkêş binêrin. Û armanca min di vê pêşkêşiyê de ev e ku ez çêtir têgihiştinek bidim ka Postgres bi rastî çi dike dema ku ew hewl dide ku hin tiştan asteng bike. Ez difikirim ku ew di astengkirina parçeyan de pir baş e.

Ka em li hin mînakên taybetî binêrin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Em ê di tabloyekê de bi tablo û rêzek dest pê bikin. Dema ku ez tiştekî têxim ser maseyê ExclusiveLock, Nasnameya Danûstendinê û ExclusiveLock li min têne xuyang kirin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ger ez du rêzên din têxim nav çi dibe? Û niha tabloya me sê rêz hene. Û min rêzek xist û ev wekî encamek wergirt. Û ger ez du rêzên din têxim nav, çi ecêb e? Li vir tiştek ecêb heye ji ber ku min sê rêz li vê tabloyê zêde kirine, lê dîsa jî di tabloya qefleyê de du rêz hene. Û ev bi rastî tevgera bingehîn a Postgres e.

Pir kes difikirin ku heke hûn di databasek de 100 rêzan kilît bikin, wê hingê hûn ê hewce bikin ku 100 navnîşên kilît biafirînin. Ger ez 1 rêzan bi yekcarî asteng bikim, wê hingê ez ê hewceyê 000 pirsên weha bikim. Û heke ez mîlyonek an mîlyarek hewce bikim ku asteng bikim. Lê eger em vê yekê bikin, ew ê pir baş nexebite. Ger we pergalek bikar aniye ku ji bo her rêzek kesane navnîşên astengkirinê diafirîne, wê hingê hûn dikarin bibînin ku ev tevlihev e. Ji ber ku hûn hewce ne ku tavilê tabloyek qefilandinê ku dikare biherike diyar bike, lê Postgres wiya nake.

Û ya ku di derbarê vê slaytê de bi rastî girîng e ev e ku ew bi zelalî destnîşan dike ku pergalek din heye ku di hundurê MVCC-ê de dimeşe ku rêzên kesane digire. Ji ber vê yekê gava ku hûn bi mîlyaran rêzan kilît dikin, Postgres mîlyarek fermanên kilîtkirinê yên cihê naafirîne. Û ev bandorek pir baş li ser hilberînê dike.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Li ser nûvekirinek çi ye? Ez niha rêzê nûve dikim, û hûn dikarin bibînin ku wê di yek carî de du operasyonên cûda pêk aniye. Di heman demê de sifrê kilît kir, lê îndeks jî kilît kir. Û wî hewce bû ku pêvekê kilît bike ji ber ku li ser vê tabloyê astengiyên bêhempa hene. Û em dixwazin piştrast bikin ku kes wê neguherîne, ji ber vê yekê em wê asteng dikin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ger ez dixwazim du rêzan nûve bikim çi dibe? Û em dibînin ku ew bi heman awayî tevdigere. Em du caran nûvekirinan dikin, lê tam heman hejmara xetên qefilandinê dikin.

Heke hûn meraq dikin Postgres çawa vê yekê dike, hûn ê hewce bikin ku guh bidin axaftinên min ên li ser MVCC da ku fêr bibin ka Postgres çawa di hundurê xwe de van rêzikên ku ew diguhezîne nîşan dide. Û Postgres rêyek heye ku ew vê yekê dike, lê ew di asta girtina maseyê de nake, ew di astek kêmtir û bikêrtir de dike.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ger ez bixwazim tiştek jêbikim çi? Ger ez, mînakî, rêzek jêbikim û hîn jî du têketinên min ên astengker hebin, û heke ez bixwazim wan hemîyan jêbikim jî, ew hîn jî li wir in.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û, wek nimûne, ez dixwazim 1 rêzan têxim nav, û paşê 000 rêzan jêbikim an lê zêde bikim, paşê ew rêzikên kesane yên ku ez lê zêde bikim an biguherim, ew li vir nayên tomar kirin. Ew di nav rêzê bixwe de di asta jêrîn de têne nivîsandin. Û di dema axaftina MVCC de min li ser vê yekê bi berfirehî axivî. Lê gava ku hûn qefleyan analîz dikin pir girîng e ku hûn pê ewle bin ku hûn di asta tabloyê de girtî ne û hûn nabînin ka rêzikên kesane çawa li vir têne tomar kirin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Çi li ser astengkirina eşkere?

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ger ez nûvekirinê bikirim, du rêzên min girtî ne. Û heke ez wan hemî hilbijêrin û "li her deverê nûve bike" bikirtînim, wê hingê hîna min du tomarên astengkirinê hene.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Em ji bo her rêzek kesane tomarên cihê naafirînin. Ji ber ku wê hingê hilberî kêm dibe, dibe ku pir zêde be. Û dibe ku em xwe di rewşeke nebaş de bibînin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û heman tişt, heke em parve bikin, em dikarin hemî 30 carî bikin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Em tabloya xwe sererast dikin, her tiştî jê dikin, dûv re dîsa rêzek têxin nav xwe.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Tevgerek din a ku hûn li Postgres-ê ku pir baş tê zanîn û tevger tê xwestin dibînin ev e ku hûn dikarin nûvekirinek an hilbijarkek bikin. Û hûn dikarin vê yekê di heman demê de bikin. Û hilbijêre nûvekirin û heman tişt di riya berevajî de asteng nake. Em ji xwîner re dibêjin bila nivîskar asteng neke, nivîskar jî xwendevan asteng neke.

Ez ê mînakek vê yekê nîşanî we bidim. Ez ê niha hilbijartinek bikim. Dûv re em ê INSERT bikin. Û paşê hûn dikarin bibînin - 694. Hûn dikarin ID-a danûstendina ku ev têketinê pêk aniye bibînin. Û ew çawa dixebite.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û ger ez naha li nasnameya xweya paşîn binêrim, ew naha 695 e.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û ez dikarim bibînim ku 695 di tabloya min de xuya dike.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û ger ez li vir bi vî rengî nûve bikim, wê hingê ez dozek cûda distînim. Di vê rewşê de, 695 kilîtek taybetî ye, û nûvekirin xwedî heman tevgerê ye, lê di navbera wan de nakokî tune, ku ew pir neasayî ye.

Û hûn dikarin bibînin ku li jor ew ShareLock e, û li jêr jî ExclusiveLock e. Û her du danûstendin jî bi ser ketin.

Û hûn hewce ne ku guh bidin axaftina min li MVCC da ku fêm bikin ka ev çawa diqewime. Lê ev nîgarek e ku hûn dikarin di heman demê de bikin, ango di heman demê de SELECT û NAVENDA NÛÇEYAN bikin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Werin em sifir bikin û operasyonek din bikin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ger hûn hewl bidin ku du nûvekirinên hevdem li ser heman rêzê bimeşînin, ew ê were asteng kirin. Û tê bîra min, min got ku xwendevan nivîskarê asteng nake, nivîskar jî xwendevanê asteng nake, lê nivîskarek nivîskarek din asteng dike. Ango, em nikarin du kesan di heman demê de heman rêzê nûve bikin. Divê hûn li bendê bimînin heya ku yek ji wan biqede.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û ji bo ku ez vê yekê ronî bikim, ez ê li tabloya Lockdemo binerim. Û em ê li yek rêzê binêrin. Her danûstendinê 698.

Me ev nû kiriye 2. 699 nûvekirina yekem e. Û ew serketî bû an jî ew di danûstendinek li bendê de ye û li benda me ye ku em piştrast bikin an betal bikin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Lê li tiştek din binêrin - 2/51 danûstendina meya yekem e, rûniştina meya yekem e. 3/112 daxwaza duyemîn e ku ji jor ve hatî û ew nirx guherand 3. Û heke hûn bala xwe bidin, ya jorîn xwe kilît kiriye, ku ev e 699. Lê 3/112 kilît neda. Stûna Lock_mode dibêje ku ew li benda çi ye. Ew 699 hêvî dike. Û heke hûn li ku derê ye 699 binêrin, ew bilindtir e. Û rûniştina yekem çi kir? Wê li ser nasnameya xweya danûstendinê qeflek taybetî çêkir. Postgres bi vî rengî dike. Ew nasnameya xwe ya danûstendinê asteng dike. Û heke hûn dixwazin li benda kesek bisekinin ku piştrast bike an betal bike, wê hingê hûn hewce ne ku li bendê bimînin dema ku danûstendinek li bendê ye. Û ji ber vê yekê em dikarin rêzek xerîb bibînin.

Ka em dîsa lê binêrin. Li milê çepê em nasnameya xweya pêvajoyê dibînin. Di stûna duyemîn de em nasnameya danûstendina xweya virtual dibînin, û di ya sêyemîn de em lock_type dibînin. Ev tê çi wateyê? Bi bingehîn ya ku ew dibêje ev e ku ew nasnameya danûstendinê asteng dike. Lê bala xwe bidin ku hemî rêzikên li jêr dibêjin têkilî. Û ji ber vê yekê hûn li ser masê du celeb kilît hene. Girtiyek pêwendiyê heye. Û dûv re jî astengkirina danûstendinê heye, ku hûn bi tena serê xwe bloke dikin, ya ku bi rastî di rêza yekem de an jî di binê jêrîn de diqewime.

Ez ê bibînim li vir çi dibe. Û li vir du tişt di heman demê de diqewimin. Hûn di rêza yekem de li qeflek nasnameya danûstendinê ya ku xwe digire dinêrin. Û ew xwe asteng dike ku mirov li bendê bihêle.

Ger hûn li rêza 6-an binerin, ew heman têketina yekem e. Û ji ber vê yekê danûstendina 699 tê asteng kirin. 700 jî xwe girtî ye. Û paşê di rêza jêrîn de hûn ê bibînin ku em li bendê ne ku 699 xebata xwe biqedîne.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û di lock_type de, hûn hejmaran dibînin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Hûn dikarin bibînin ku ew 0/10 e. Û ev jimareya rûpelê ye, û di heman demê de dûrbûna vê rêza taybetî ye.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û hûn dibînin gava ku em nûve dikin ew dibe 0/11.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Lê di rastiyê de ew 0/10 e, ji ber ku li benda vê operasyonê ye. Derfeta me heye ku em bibînin ku ev rêzefîlma ku ez li bendê me ku piştrast bikim e.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Carekê me ew piştrast kir û pêl commit kir, û gava ku nûvekirin qediya, tiştê ku em ji nû ve distînin ev e. Danûstandin 700 yekane kilît e, ew li benda kesek din namîne ji ber ku ew hate kirin. Ew bi tenê li benda qedandina danûstendinê ye. Dema ku 699 xilas bibe, êdî em li benda tiştek namînin. Û naha danûstendina 700 dibêje ku her tişt baş e, ku li ser hemî tabloyên destûr hemî kilîdên ku hewce dike hene.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û ji bo ku ev tişt hîn tevlihevtir bibe, em nêrînek din diafirînin, ku vê carê dê hiyerarşiyek ji me re peyda bike. Ez hêvî nakim ku hûn vê daxwazê ​​fam bikin. Lê ev ê ji me re nêrînek zelal a ku diqewime bide.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ev nêrînek vegerî ye ku beşek din jî heye. Û paşê ew her tiştî dîsa vedigere hev. Ka em vê bikar bînin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ger em sê nûvekirinên hevdem bikin û bibêjin ku rêz niha sê ye. Û em ê 3 bi 4 biguherînin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û li vir em dibînin 4. Û Nasnameya danûstendinê 702.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û paşê ez ê 4 biguherim 5. Û 5 ber 6, û 6 bi 7. Û ez ê çend kesên ku dê li benda bidawîbûna vê danûstendinê bin rêz bikim.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û her tişt zelal dibe. Rêza yekem çi ye? Ev 702 e. Ev nasnameya danûstendinê ye ku di destpêkê de vê nirxê destnîşan kiriye. Di stûna min a Destûrdayî de çi hatiye nivîsandin? Nîşanên min hene f. Ev nûvekirinên min in ku (5, 6, 7) nayên pejirandin ji ber ku em li bendê ne ku ID-ya danûstendinê 702 bi dawî bibe. Li wir me astengkirina nasnameya danûstendinê heye. Û ev di encamê de 5 qefleyên nasnameya danûstendinê pêk tê.

Û eger hûn li 704, li 705 binêrin, hîn tiştek li wir nehatiye nivîsandin, ji ber ku ew hîn nizanin ka çi diqewime. Ew bi tenê dinivîsin ku ew nizanin ka çi diqewime. Û ew ê tenê bi xew ve biçin ji ber ku ew li bendê ne ku kesek biqedîne û gava ku fersend hebe ku rêzan biguhezîne, şiyar bibin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ev e ku ew xuya dike. Eşkere ye ku hemû li benda rêza 12’an in.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ya ku me li vir dît ev e. Li vir 0/12 e.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ji ber vê yekê gava ku danûstendina yekem were pejirandin, hûn dikarin li vir bibînin ka hiyerarşiya çawa dixebite. Û niha her tişt zelal dibe. Hemû paqij dibin. Û bi rastî ew hîn jî li bendê ne.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Li vir çi diqewime. 702 dike. Û naha 703 vê kilîtkirina rêzê digire, û dûv re 704 dest pê dike li benda 703-ê ye ku bike. Û 705 jî li benda vê yekê ye. Û gava ev hemû temam dibin, ew xwe paqij dikin. Û ez dixwazim destnîşan bikim ku her kes li rêzê ye. Û ev pir dişibe rewşek di qelebalixiya trafîkê de dema ku her kes li benda gerîdeya yekem e. Otomobîla yekem disekine û her kes di rêzeke dirêj de radiweste. Dûv re ew dimeşe, wê hingê gerîdeya din dikare pêş de bimeşe û bloka xwe bigire, hwd.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û heke ev ji we re têra xwe tevlihev xuya nedikir, wê hingê em ê nuha ji we re li ser xitimanan bipeyivin. Ez nizanim kê ji we bi wan re rûbirû bûye. Ev di pergalên databasê de pirsgirêkek pir hevpar e. Lê xitimî ew in dema ku rûniştinek li benda rûniştinek din e ku tiştek bike. Û di vê gavê de rûniştinek din li benda rûniştina yekem e ku tiştek bike.

Û, wek nimûne, eger Îvan bêje: "Tiştekî bide min", û ez dibêjim: "Na, ez ê tenê bidim te, eger tu tiştekî din bidî min." Û dibêje: “Na, heger tu nedî min ez nadim te.” Û em dikevin rewşeke xitimî. Ez piştrast im ku Ivan dê wiya neke, lê hûn wateya vê yekê fam dikin ku em du kes hene ku dixwazin tiştek bi dest bixin û ew ne amade ne ku wiya bidin heta ku yê din tiştê ku ew dixwazin nede wan. Û çare tune.

Û bi bingehîn, databasa we pêdivî ye ku vê yekê tespît bike. Dûv re hûn hewce ne ku yek ji danişînan jêbikin an bigirin, ji ber ku wekî din ew ê her û her li wir bimînin. Û em wê di databasan de dibînin, em wê di pergalên xebitandinê de dibînin. Û li her deverên ku pêvajoyên me yên paralel hene, ev dikare bibe.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û niha em ê du xalên mirinê saz bikin. Em ê deynin 50 û 80. Di rêza yekem de, ez ê ji 50-ê nûve bikim 50. Ez ê jimareya danûstendinê bistînim 710.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û paşê ez ê 80 biguherim 81, û 50 bi 51.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û ev e ku ew ê mîna. Û ji ber vê yekê 710 rêzek hatiye asteng kirin, û 711 li benda pejirandinê ye. Dema ku me nûve kir me ev yek dît. 710 xwediyê rêza me ye. Û 711 li bendê ye ku 710 danûstendinê temam bike.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û tewra dibêje ku xitimandin li ser kîjan rêzê çêdibin. Û li vir e ku ew dest pê dike xerîb.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Niha em 80 heta 80 nûve dikin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û ev cihê ku xitimandin dest pê dike. 710 li benda bersivek ji 711-ê ye, û 711 li benda 710-ê ye. Û ev ê baş bi dawî nebe. Û tu rê ji vê yekê re tune. Û ew ê ji hevdû bersivek hêvî bikin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û ew ê tenê dest bi derengkirina her tiştî bike. Û em vê yekê naxwazin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û Postgres awayên ku gava ku ev diqewime haydar e. Û gava ku ev diqewime, hûn vê xeletiyê digirin. Û ji vê yekê jî diyar dibe ku pêvajoyek wusa û wusa li benda LOCK PARVEKIRINek ji pêvajoyek din e, ango ku ji hêla pêvajoya 711 ve hatî asteng kirin. Û ew pêvajo li bendê bû ku SHARE LOCK li ser nasnameyek danûstendinê ya filan bê dayîn û ji hêla pêvajoyek weha ve hate asteng kirin. Ji ber vê yekê di vir de rewşeke xitimî heye.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Gelo kêşeyên sê alî hene? Gelo mimkûn e? Erê.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Em van hejmaran têxin tabloyekê. Em 40 bi 40 diguherînin, em astengkirinê dikin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Em 60 bi 61, 80 bi 81 diguherînin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û dûv re em 80 diguherînin û dûv re jî geş dibin!

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û 714 niha li benda 715-ê ye. 716-an li benda 715-an e. Û li ser wê tiştek nayê kirin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Êdî li vir du kes nîn in, jixwe sê kes li vir in. Ez tiştekî ji te dixwazim, ev yek ji kesê sêyem tiştekî, yê sêyem jî tiştekî ji min dixwaze. Û em li benda sê alî diqedin ji ber ku em hemî li bendê ne ku kesê din tiştê ku ew hewce dike temam bike.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û Postgres dizane ku ev li ser kîjan rêzê diqewime. Û ji ber vê yekê ew ê peyama jêrîn bide we, ku nîşan dide ku we pirsgirêkek heye ku sê têketin hevûdu asteng dikin. Û li vir tu sînor tune. Dibe ku ev rewş be ku 20 navnîşan hevûdu asteng bikin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Pirsgirêka din serializable e.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ger lock serializable taybet.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û em vegerin ser 719. Derketina wê pir normal e.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û hûn dikarin bikirtînin da ku danûstendinê ji serializable bikin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û hûn fêhm dikin ku we nuha celebek SA-yê cûda heye - ev tê wateya serializable.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ji ber vê yekê me celebek nû ya kilît heye bi navê SARieadLock, ku kilîtek rêzefîlm e û dihêle hûn rêzefilman têkevin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û her weha hûn dikarin navnîşên bêhempa têxin nav xwe.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Di vê tabloyê de indexên me yên yekta hene.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ji ber vê yekê eger ez li vir hejmara 2-ê deynim, ji ber vê yekê min 2-yek heye. Lê di serî de, min 2-yek din xist hundur. Û hûn dikarin bibînin ku 721 xwedan kilîtek taybetî ye. Lê naha 722 li benda 721ê ye ku xebata xwe temam bike ji ber ku ew nikare 2-ê têxe heya ku nizane dê çi bibe 721.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û eger em subtransaction bikin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Li vir 723 me hene.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û heke em xalê hilînin û dûv re wê nûve bikin, wê hingê em nasnameyek danûstendinê ya nû digirin. Ev şêwazek din a tevgerê ye ku divê hûn jê haydar bin. Ger em vê vegerînin, wê hingê nasnameya danûstendinê diçe. 724 diçe. Lê niha 725 me hene.

Ji ber vê yekê ez hewl didim ku li vir çi bikim? Ez hewl didim ku mînakên qefleyên neasayî yên ku hûn dikarin bibînin nîşanî we bidim: gelo ew qeflên serialîzekirî be an SAVEPOINT be, ev celeb celeb kilît in ku dê di tabloya qeflê de xuya bibin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ev çêkirina qefleyên eşkere (eşkere) yên ku pg_advisory_lock hene.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û hûn dibînin ku celebê astengkirinê wekî şêwirmendî tête navnîş kirin. Û li vir bi sor dibêje "şîret". Û hûn dikarin di heman demê de bi vî rengî bi pg_advisory_unlock re asteng bikin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û di encamê de, ez dixwazim tiştek din a hişê xwe nîşanî we bidim. Ez ê nêrînek din ava bikim. Lê ez ê tevlî tabloya pg_locks bi tabloya pg_stat_activity re bibim. Û çima ez dixwazim vê yekê bikim? Ji ber ku ev ê bihêle ku ez li hemî danişînên heyî binihêrim û bibînim û bi rastî bibînim ka ew li benda çi celeb kilît in. Û ev pir balkêş e dema ku em tabloya kilît û tabloya pirsê li hev bikin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û li vir em pg_stat_view diafirînin.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û em rêzê bi yek nûve dikin. Û li vir em dibînin 724. Û paşê em rêza xwe ya sê nûjen bikin. Û hûn niha li vir çi dibînin? Ev daxwaz in, ango hûn tevahiya navnîşa daxwazên ku di stûna çepê de têne navnîş kirin dibînin. Û paşê li milê rastê hûn dikarin astengiyan û tiştên ku ew diafirînin bibînin. Û ew dikare ji we re zelaltir be, da ku hûn ne hewce ne ku her carê li her danişînê vegerin û bibînin ka hûn hewce ne ku beşdarî wê bibin an na. Ji bo me dikin.

Taybetmendiyek din a ku pir bikêr e ev e pg_blocking_pids. Dibe ku we qet qala wê nebihîstiye. Ew çi dike? Ew dihêle ku em bibêjin ku ji bo vê danişînê 11740 li benda kîjan nasnameyên pêvajoyê yên taybetî ye. Û hûn dikarin bibînin ku 11740 li benda 724 e. Û 724 li jor e. Û 11306 nasnameya pêvajoya we ye. Di bingeh de, ev fonksiyon di tabloya kilîtkirina we re derbas dibe. Û ez dizanim ew hinekî tevlihev e, lê hûn dikarin wê fêm bikin. Di bingeh de ev fonksiyon di vê tabloya qefilandinê re derbas dibe û hewl dide ku bibîne ka li ku derê vê nasnameya pêvajoyê kilîdên ku ew li bendê ye tê dayîn. Û di heman demê de ew hewl dide ku fêhm bike ku pêvajoya ku li benda qefilandinê ye bi kîjan nasnameya pêvajoyê ye. Ji ber vê yekê hûn dikarin vê fonksiyonê bimeşînin pg_blocking_pids.

Û ev dikare pir bikêr be. Me ev tenê di guhertoya 9.6 de zêde kir, ji ber vê yekê ev taybetmendî tenê 5 salî ye, lê ew pir, pir bikêr e. Û heman tişt ji bo daxwaza duyemîn jî derbas dibe. Ew tam tiştê ku divê em bibînin nîşan dide.

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ya ku min dixwest bi we re bipeyivim ev e. Û wek ku min hêvî dikir, me hemû wextê xwe bi kar anî ji ber ku gelek slayt hebûn. Û slaytên ji bo dakêşanê hene. Ez dixwazim spasiya we bikim ku hûn li vir in. Ez bawer im ku hûn ê ji konferansa mayî kêfxweş bibin, gelek spas!

Pirs:

Mînakî, heke ez hewl didim ku rêzan nûve bikim, û rûniştina duyemîn hewl dide ku tevahiya tabloyê jê bibe. Bi qasî ku ez têdigihim, divê tiştek mîna qefila niyetê hebe. Li Postgresê tiştekî wisa heye?

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Ka em vegerin ser destpêkê. Dibe ku hûn bi bîr bînin ku gava hûn tiştek dikin, mînakî gava ku hûn hilbijarkek dikin, em AccessShareLock derdixin. Û ev rê li ber daxistina maseyê digire. Ji ber vê yekê heke hûn, mînakî, dixwazin rêzek di tabloyê de nûve bikin an rêzek jêbirin, wê hingê kes nikare di heman demê de tevahiya tabloyê jêbibe ji ber ku hûn vê AccessShareLock-ê li ser tevahiya tabloyê û li ser rêzê digirin. Û gava ku hûn qedandin, ew dikarin wê jêbirin. Lê dema ku hûn rasterast tiştek li wir biguhezînin, ew ê nikaribin wiya bikin.

Ka em dîsa bikin. Ka em biçin ser mînaka jêbirinê. Û hûn dibînin ka çawa li ser rêza li jor tevahiya sifrê kilîtek taybetî heye.

Ev dê mîna lock exclusive xuya, rast?

Erê, ew xuya dike. Ez fêm dikim ku hûn li ser çi dipeyivin. Hûn dibêjin ku ger ez hilbijarkek bikim wê hingê min ShareExclusive heye û dûv re ez wê bikim Row Exclusive, gelo ew dibe pirsgirêk? Lê ecêb e ku ev pirsgirêk dernakeve. Ev dixuye ku pileya qefilandinê zêde dike, lê di bingeh de qeflek min heye ku pêşî li jêbirinê digire. Û naha, gava ku ez vê qeflê bi hêztir dikim, ew dîsa jî pêşî li jêbirinê digire. Ji ber vê yekê ne wekî ez diçim jor. Ango dema ku di asteke jêrîn de bû rê li ber vê yekê girt, lewra gava ez asta wê bilind dikim dîsa jî rê li ber jêbirina tabloyê digire.

Ez fêm dikim ku hûn li ser çi dipeyivin. Li vir dozek mezinbûna kilît tune, ku hûn hewl didin ku dev ji yek kilît berdin da ku yekî bihêztir bidin nasîn. Li vir ew tenê vê pêşîlêgirtinê li seranserê panelê zêde dike, ji ber vê yekê ew nabe sedema pevçûnê. Lê pirsek baş e. Gelek spas ji bo vê pirsê!

Dema ku gelek danişînên me hene, hejmareke mezin a bikarhêneran divê em çi bikin da ku ji rewşek xitimandinê dûr nekevin?

Postgres bixweber rewşên xitimandinê dibîne. Û ew ê bixweber yek ji danişînan jê bibe. Awayê yekane ku meriv xwe ji bloka mirî dûr bigire ev e ku meriv bi heman rêzê bloke bike. Ji ber vê yekê gava ku hûn li serlêdana xwe dinêrin, gelek caran sedema xitimandinê... Ka em bifikirin ku ez dixwazim du tiştên cûda asteng bikim. Serlêdanek tabloya 1, û serîlêdanek din 2, û dûv re jî tabloya 1 kilît dike. Û awayê herî hêsan ku meriv xwe ji xitimandinê dûr bixe ev e ku meriv li serlêdana xwe binêre û hewl bide ku pê ewle bibe ku kilîtkirin di hemî serlêdanan de bi heman rêzê pêk tê. Û ev bi gelemperî 80% pirsgirêkan ji holê radike, ji ber ku her cûre mirov van serîlêdanan dinivîsin. Û heke hûn wan bi heman rêzê asteng bikin, wê hingê hûn bi rewşek xitimandinê re rû bi rû nabin.

Gelek spas ji bo performansa we! We qala valahiya tije kir û, ger ez rast fêm bikim, valahiya tijî rêza tomarên di depoya cihêreng de xera dike, ji ber vê yekê ew tomarên heyî neguhêrbar dihêlin. Çima valahiya tijî gihîştina kilîtkirî ya taybetî digire û çima ew bi operasyonên nivîsandinê re nakokî dike?

Ew pirsek baş e. Sedem ev e ku valahiya tije maseyê digire. Û em bi bingehîn guhertoyek nû ya tabloyê diafirînin. Û tablo dê nû be. Derket holê ku ev ê guhertoyek tabloyek bi tevahî nû be. Û pirsgirêk ev e ku gava em vê yekê dikin, em naxwazin ku mirov wê bixwînin ji ber ku em hewce ne ku ew tabloya nû bibînin. Û bi vî awayî ev bi pirsa berê ve girêdayî ye. Heger me di heman demê de bixwîne, em ê nikaribin wê biguhezînin û mirovan arasteyî tabloyeke nû bikin. Pêdivî ye ku em li bendê bin ku her kes xwendina vê tabloyê biqedîne, û ji ber vê yekê ew di bingeh de rewşek bêkêmasî ye.
Em tenê dibêjin ku em ji destpêkê ve kilît dikin ji ber ku em dizanin ku di dawiyê de ji bo ku em herkesî berbi kopiyek nû veguhezînin em ê hewceyê qeflek taybetî bin. Ji ber vê yekê em potansiyel dikarin vê yekê çareser bikin. Û em bi vî awayî bi nîşankirina hevdemî dikin. Lê kirina vê yekê pir dijwartir e. Û ev pir bi pirsa weya berê ya di derbarê lock exclusive ve girêdayî ye.

Ma gengaz e ku meriv dema qefilandinê li Postgres zêde bike? Di Oracle de, ez dikarim, mînakî, binivîsim "hilbijêre ku nûve bike" û berî nûvekirinê 50 saniye li bendê bim. Ji bo serîlêdanê baş bû. Lê li Postgres, an hewce ye ku ez tavilê wiya bikim û qet li bendê nemînim, an jî heya demek bisekinim.

Erê, hûn dikarin li ser kilîdên xwe, li ser qeflên xwe demek dirêj hilbijêrin. Her weha hûn dikarin fermanek bê rê derxînin, ku ew ê... heke hûn nikaribin tavilê qeflê bi dest bixin. Ji ber vê yekê, an demek qefilandinê an tiştek din ku dê bihêle hûn vê yekê bikin. Ev di asta hevoksaziyê de nayê kirin. Ev wekî guherbarek li ser serverê tête kirin. Carinan ev nayê bikar anîn.

Hûn dikarin slide 75 vekin?

Erê

Vekirina Rêvebirê Lockê Postgres. Bruce Momjian

Û pirsa min ev e. Çima herdu pêvajoyên nûvekirinê li hêviya 703 ne?

Û ev pirsek mezin e. Bi awayê, ez fam nakim çima Postgres vê yekê dike. Lê gava ku 703 hate afirandin, ew li hêviya 702 bû. Û dema ku 704 û 705 xuya dibin, wusa dixuye ku ew nizanin ku ew li hêviya çi ne ji ber ku hîn tiştek li wir tune. Û Postgres bi vî rengî dike: gava ku hûn nikanin kilîtekê bistînin, ew dinivîse "Çi ye ku hûn pêvajoy bikin?", ji ber ku hûn jixwe li benda kesek in. Ji ber vê yekê em ê tenê bihêlin ku ew li hewa bimîne, ew ê qet nûve neke. Lê li vir çi qewimî? Hema ku 702 pêvajo qedand û 703 qefla xwe wergirt, pergal vegeriya. Û wê got ku niha du kesên me hene ku li bendê ne. Û paşê em wan bi hev re nûve bikin. Û em destnîşan bikin ku herdu jî li bendê ne.

Ez nizanim çima Postgres vê yekê dike. Lê pirsgirêkek bi navê f…. Bi dîtina min ev ne peyvek bi rûsî ye. Ev dema ku her kes li benda kelehekê ye, 20 rayedar jî li benda qesrê ne. Û ji nişka ve ew hemû di heman demê de şiyar dibin. Û her kes dest bi hewldana reaksiyonê dike. Lê sîstem wisa dike ku her kes li benda 703-ê ye. Ji ber ku ew hemî li bendê ne, û em ê tavilê wan hemî rêz bikin. Û heke daxwazek nû ya din xuya bibe ku piştî vê yekê hatî çêkirin, mînakî, 707, wê hingê dê dîsa valahî hebe.

Û ji min re xuya dike ku ev yek tê kirin da ku em bibêjin ku di vê qonaxê de 702 li benda 703-ê ye, û hemî kesên ku piştî wê werin dê di vî warî de nebin. Lê gava ku garsonê yekem derdikeve, hemî kesên ku di wê gavê de li benda nûvekirinê bûn heman nîşanê werdigirin. Û ji ber vê yekê ez difikirim ku ev tê kirin da ku em bi rêkûpêk pêvajoyê bikin da ku ew bi rêkûpêk bêne ferman kirin.

Min her gav li vê yekê wekî diyardeyek ecêb dinêrî. Ji ber ku li vir, wek nimûne, em wan bi tevahî navnîş nakin. Lê bi min wisa dixuye ku her cara ku em qeflek nû didin, em li hemî kesên ku di pêvajoya bendewariyê de ne dinêrin. Paşê em wan hemûyan rêz dikin. Û dûv re her yekî nû ku tê de tenê gava ku kesê din pêvajo bi dawî bibe dikeve rêzê. Pirsa pir baş. Gelek spas ji bo pirsa we!

Ji min re xuya dike ku gava ku 705 704 hêvî dike pir maqûltir e.

Lê pirsgirêk li vir ev e. Ji hêla teknîkî ve, hûn dikarin yek an ya din hişyar bikin. Û bi vî awayî em ê yek an ya din hişyar bikin. Lê di pergalê de çi dibe? Hûn dikarin bibînin ka çawa 703 li jorê nasnameya xwe ya danûstendinê asteng kiriye. Postgres bi vî rengî dixebite. Û 703 bi nasnameya xwe ya danûstendinê ve tê asteng kirin, ji ber vê yekê heke kesek bixwaze li bendê bimîne, wê hingê ew ê li benda 703 bisekinin. Û, di eslê xwe de, 703 temam dike. Û tenê piştî qedandina wê yek ji pêvajoyan hişyar dibe. Û em nizanin ev pêvajo dê bi rastî çi be. Dûv re em her tiştî hêdî hêdî pêvajoyê dikin. Lê ne diyar e ka kîjan pêvajo pêşî hişyar dibe, ji ber ku dibe ku yek ji van pêvajoyan be. Di bingeh de, me plansaziyek hebû ku digot em naha dikarin yek ji van pêvajoyan hişyar bikin. Em tenê yek random hilbijêre. Ji ber vê yekê her du jî hewce ne ku bêne destnîşan kirin ji ber ku em dikarin her yekê ji wan hişyar bikin.

Û pirsgirêk ev e ku me CP-bêdawî heye. Û ji ber vê yekê, pir îhtîmal e ku em ê paşê hişyar bikin. Û heke, wek nimûne, em yê paşîn hişyar bikin, em ê li benda yê ku nû bloka wergirtiye bisekinin, ji ber vê yekê em diyar nakin ka kî bi rastî dê pêşî şiyar bibe. Em bi tenê rewşek weha diafirînin, û pergal dê wan bi rêzek rasthatî şiyar bike.

Ð • n, Nûh * de gotarên di derbarê qefleyan de ji hêla Egor Rogov ve. Binêrin, ew jî balkêş û kêrhatî ne. Mijar, bê guman, pir tevlihev e. Gelek spas, Bruce!

Source: www.habr.com

Add a comment