Ihe dị iche iche nke usoro ime PostgreSQL na-enye ya ohere ịdị ngwa ngwa n'ọnọdụ ụfọdụ yana "ọ bụghị ngwa ngwa" na ndị ọzọ. Taa, anyị ga-elekwasị anya na ọmụmaatụ ama ama nke esemokwu n'etiti otu DBMS si arụ ọrụ yana ihe onye nrụpụta na-eji ya - Mmelite vs ụkpụrụ MVCC.
Akụkọ dị nkenke sitere na
Mgbe ejiri iwu Nwelite gbanwee ahịrị, a na-arụ ọrụ abụọ n'ezie: HIchapụ na INSERT. N'ime ụdị eriri ugbu a xmax ka edobere ya na ọnụọgụ azụmahịa nke mere mmelite ahụ. Mgbe ahụ, e kere ya ụdị ọhụrụ otu ahịrị; uru xmin ya dabara na uru xmax nke ụdị gara aga.
Oge ụfọdụ ka emechara azụmahịa a, ụdị ochie ma ọ bụ nke ọhụrụ, dabere na ya COMMIT/ROOLBACK
, a ga-amata "nwụrụ anwụ" (ndị nwụrụ anwụ) mgbe ị na-agafe VACUUM
dị ka tebụl ma kpochapụ.
Ma nke a agaghị eme ozugbo, ma nsogbu na "ndị nwụrụ anwụ" nwere ike nweta ngwa ngwa - na ugboro ugboro ma ọ bụ
#1: Ọ na-amasị m ịkwaga ya
Ka anyị kwuo na usoro gị na-arụ ọrụ na mgbagha azụmahịa, na mberede ọ ghọtara na ọ ga-adị mkpa imelite mpaghara X na ndekọ ụfọdụ:
UPDATE tbl SET X = <newX> WHERE pk = $1;
Mgbe ahụ, ka ogbugbu na-aga n'ihu, ọ na-apụta na a ga-emelitekwa ubi Y:
UPDATE tbl SET Y = <newY> WHERE pk = $1;
... na mgbe ahụ Z - gịnị kpatara na-atụfu oge na obere ihe?
UPDATE tbl SET Z = <newZ> WHERE pk = $1;
Ụdị ndekọ ole ka anyị nwere ugbu a na nchekwa data? ee, 4 iberibe! N'ime ndị a, otu dị mkpa, na 3 ga-asachapụ gị site na [auto]VACUM.
Emela ya otú a! Jiri na-emelite mpaghara niile n'otu arịrịọ - ọ fọrọ nke nta ka ọ bụrụ mgbe niile, enwere ike ịgbanwe echiche nke usoro ahụ dị ka nke a:
UPDATE tbl SET X = <newX>, Y = <newY>, Z = <newZ> WHERE pk = $1;
#2: Jiri dị iche na, Luk!
Yabụ, ị ka chọrọ
UPDATE tbl SET X = <newX> WHERE pk BETWEEN $1 AND $2;
A arịrịọ na mkpokọta ụdị a na-emekarị na ọ fọrọ nke nta ka ọ bụrụ mgbe niile ọ bụghị iji mejupụta ubi ọhụrụ efu, kama iji dozie ụfọdụ njehie na data. N'otu oge ahụ, ya onwe ya A naghị eburu n'uche izi ezi nke data dị ugbu a ma ọlị - ma n'efu! Ya bụ, a na-edegharị ihe ndekọ ahụ, ọ bụrụgodị na ọ nwere kpọmkwem ihe a chọrọ - ma gịnị kpatara ya? Ka anyị dozie ya:
UPDATE tbl SET X = <newX> WHERE pk BETWEEN $1 AND $2 AND X IS DISTINCT FROM <newX>;
Ọtụtụ ndị mmadụ amaghị maka ịdị adị nke onye ọrụ dị ebube dị otú a, yabụ ebe a bụ mpempe akwụkwọ aghụghọ IS DISTINCT FROM
na ndị ọrụ ezi uche ndị ọzọ iji nyere aka:
... na ntakịrị banyere arụmọrụ na mgbagwoju anya ROW()
-okwu:
#3: Amatara m obi m site na... igbochi
na-amalite ọrụ abụọ yiri usoro, nke ọ bụla n'ime ha na-agbalị kanye akara ntinye na ọ "na-aga n'ihu":
UPDATE tbl SET processing = TRUE WHERE pk = $1;
Ọbụlagodi na usoro ndị a na-eme ihe na-adabereghị na ibe ha, mana n'ime otu ID ahụ, onye ahịa nke abụọ ga-akpọchi “arịrịọ a” ruo mgbe azụmaahịa mbụ ga-agwụ.
Ngwọta #1: A na-ebelata ọrụ ahụ na nke gara aga
Ka anyị tinye ya ọzọ IS DISTINCT FROM
:
UPDATE tbl SET processing = TRUE WHERE pk = $1 AND processing IS DISTINCT FROM TRUE;
N'ụdị a, arịrịọ nke abụọ agaghị agbanwe ihe ọ bụla na nchekwa data, ihe niile adịlarị ka ọ kwesịrị ịdị - yabụ, igbochi agaghị eme. Na-esote, anyị na-edozi eziokwu nke "ịchọghị" ndekọ na algọridim etinyere.
Ngwọta #2: mkpọchi ndụmọdụ
Nnukwu isiokwu maka edemede dị iche, nke ị nwere ike ịgụ banyere ya
Ngwọta #3: oku nzuzu
Ma nke a bụ kpọmkwem ihe kwesịrị ime gị arụ ọrụ n'out oge na otu ndekọ? Ma ọ bụ ị mejọrọ algọridim maka ịkpọ mgbagha azụmahịa n'akụkụ ndị ahịa, dịka ọmụmaatụ? Ma ọ bụrụ na ị na-eche maka ya? ..
isi: www.habr.com