Huu ni hitilafu niliyoiona mara mbili, katika injini mbili tofauti. Usafirishaji mmoja unaendeshwa saa 10:00 na kurekodi muhuri wa juu zaidi wa muda wa mabadiliko ya mwisho uliouona. Muamala mmoja ulioanza saa 09:58 bado uko wazi, unafanya commit saa 10:03 na hubeba muhuri wa muda kutoka alipoanza. Usafirishaji unaofuata unaomba tu safu mpya zaidi ya 10:00 na haiuoni kamwe. Ukubwa wa uhamishaji ulikuwa bora na data ilikuwa mbaya.

Fuatilia usafirishaji uliopoteza safu moja

Fuatilia mpangilio wa matukio, sio SQL. Programu huandika muda wa mabadiliko ya safu wakati muamala unaanza, sio wakati unafanya commit. Msafirishaji husoma alama ya maji ya saa ya ukutani wakati muamala huo bado uko wazi. Kisha muamala hufanya commit na muda wa mabadiliko uliozee zaidi kuliko alama ya maji iliyohifadhiwa. Kundi linalofuata la mtumiaji huanza baada ya alama ya maji, kwa hiyo safu inabaki nyuma ya kielekezi na haitachaguliwa tena kamwe.

Hakuna kinachorekodi hitilafu, kwa sababu hakuna kilichoshindwa. Hii ndiyo inayofanya aina hii ya hitilafu kuwa ghali: mtiririko wa delta ni wa haraka, hesabu za safu zinaonekana za kuaminika, na safu inayokosekana inaibuka wiki kadhaa baadaye kama tikiti ya upatanisho ambayo hakuna anayeweza kuizalisha tena.

Namba za mfululizo zina umbo lilelile la kasoro kwa sababu nyingine. ID ya mfululizo inakuambia mpangilio wa ugawaji wa thamani, sio mpangilio ambao miamala ilifanya commit. Muamala uliochukua namba ndogo unaweza kufanya commit baada ya ule uliochukua namba kubwa, kwa hiyo kielekezi kinachotegemea mpangilio wa ugawaji kinaweza pia kuacha shimo.

Ahadi tano ambazo mtiririko lazima utoe

Kabla ya kuchagua usafirishaji, omba mfumo wa chanzo mkataba wenye vifungu vitano. Ikiwa kifungu chochote kinakosekana, unayo dhahania na sio mtiririko wa mabadiliko.

  • Ufunikaji: uingizaji, masasisho na ufutaji, kila kimoja kikiwa na ufunguo thabiti unaohitajika kuutumia.
  • Mpaka: maana ya thamani ya kielekezi na kile kundi thabiti lililomo.
  • Uthabiti: jinsi majedwali yanayohusiana yanavyosomwa bila kuchanganya hali za chanzo zisizopatana.
  • Uhifadhi: muda ambao mtumiaji aliyekatwa anaweza kuendelea kutoka nafasi yake iliyohifadhiwa.
  • Uanzishaji upya: snapshot kamili inayotumika wakati nafasi hiyo si halali tena.

Utaratibu unaotumika unaweza kutimiza zote tano. Nyaraka za SQL Server kuhusu ufuatiliaji wa mabadiliko ni mfano mmoja mahususi uliochapishwa: hufafanua toleo la chini la halali, hurekodi ufutaji pamoja na mabadiliko, na huelezea muamala wa snapshot unaojumuisha uthibitishaji, ukamataji wa toleo na maswali ya mabadiliko yanayohusiana. Ni mfano wa kile cha kudai kutoka kwa chanzo, sio sintaksia unayoweza kuibandika kwenye injini nyingine.

Buni kituo cha ukaguzi kama sehemu ya bomba

Nafasi iliyohifadhiwa ya mtumiaji ndiyo mashine halisi ya hali, kwa hiyo iandike hivyo. Kielekezi kinaweza kusonga mbele tu kupitia mtiririko wa kazi ambao tayari umetumia kundi na kufanya commit muamala lengwa.

cursor  = durable_checkpoint()          # last fully applied position
batch   = extract(cursor, upper_bound)  # one consistent batch
apply(batch)                            # idempotent at the target
commit()
checkpoint(batch.upper_bound)           # only now

Ikiwa uwasilishaji unashindwa katikati, patanisha kundi lilelile badala ya kubuni nafasi mpya ya chanzo. Kuchota upya kwa mpaka wa juu mpya zaidi ndiyo njia ambayo matumizi ya sehemu huwa pengo la kudumu. Kanuni ya kioo inatumika pia upande wa pili: matumizi ya idempotent kwenye lengo huzuia nakala na haifanyi chochote kwa mabadiliko ambayo uchotaji haukuona kamwe.

Ufutaji unahitaji kumbukumbu, sio hitimisho

Kulinganisha safu ambazo bado zipo hakuwezi kumwambia mtumiaji ni funguo zipi zilizotoweka. Chanzo kisichorekodi ufutaji kamwe kinakuachia chaguo mbili zisizokamilika: kuweka historia ya funguo kwa muda wa kutosha kwa diff, au kuendesha upatanisho kamili wa wazi kwa ratiba. Zote mbili ni maamuzi ya muundo yenye gharama, na hakuna hata moja inayokuwepo isipokuwa kuna mmiliki.

Uhifadhi ni aina hiyo hiyo ya uamuzi. Kila mtiririko wa mabadiliko unaotumika una dirisha; litangaze katika mkataba na uonye wakati kituo cha ukaguzi cha mtumiaji kinakaribia. Mtumiaji anayeamka baada ya kukatizwa kwa wiki mbili anapaswa kusoma hitilafu wazi "uanzishaji upya unahitajika" badala ya kupokea kwa utulivu kundi la sehemu.

Kisha pima kama delta ilistahili

Kurudi kulinganisha kila ufunguo na hash wakati mwingine ni sahihi, na inafaa kujua gharama yake. Bado unahamisha taarifa kuhusu kila safu, hash hazikupi snapshot thabiti kwenye majedwali, na mpango wa hash huleta maswali yake kuhusu uwakilishi na migongano. Baiti chache zenye mpaka unaoweza kuthibitishwa ndio lengo; baiti chache zinazodondosha kwa utulivu mabadiliko yaliyofanyiwa commit si delta hata kidogo.

Safu ya mabadiliko ya mwisho ni kidokezo. Kielekezi kinachostahimili commit ya kuchelewa, ufutaji na kukatizwa kwa muda mrefu ni mkataba.

Makala zinazohusiana