Rijiyar delta ɗinku tana rasa commits na jinkiri: gina cursor amintacce
Layi ɗaya ya iso a jinkiri saboda alamar ruwa ba iyakar commit ba ce. Bi gazawar, sannan ka ayyana ɗauki, iyaka, riƙewa da ci gaba mai aminci.
Ga gazawa da na gani sau biyu, a cikin injuna biyu daban-daban. Wani fitarwa yana gudana da 10:00 kuma yana rubuta mafi girman tambarin lokacin gyara na ƙarshe da ya gani. Wata ma'amala da ta fara da 09:58 tana buɗe, tana commit da 10:03, kuma tana ɗauke da tambarin lokaci daga lokacin da ta fara. Fitarwa ta gaba tana neman layukan da suka fi 10:00 sabo ne kawai kuma ba ta taɓa ganinta. Girman canja wuri ya yi kyau amma bayanan ba daidai ba ne.
Bi fitarwar da ta rasa layi
Bi tsarin abubuwan da suka faru maimakon SQL. Aikace-aikacen yana rubuta lokacin gyaran layin lokacin da ma'amala ta fara, ba lokacin da ta commit ba. Mai fitarwa yana karanta alamar ruwan agogon bango yayin da ma'amalar ke buɗe. Sannan ma'amalar tana commit da lokacin gyara wanda ya fi alamar ruwar da aka ajiye tsufa. Batch na gaba na mabukaci yana farawa bayan alamar ruwan, don haka layin yana bayan cursor kuma ba za a taɓa zaɓe shi ba.
Babu abin da ke rubuta kuskure, domin babu abin da ya kasa. Wannan ne ke sa irin wannan kuskure ya yi tsada: rijuyar delta tana da sauri, adadin layuka yana da kyau, kuma layin da ya ɓace yana bayyana makonni da yawa daga baya a matsayin tikitin daidaitawa wanda babu wanda zai iya sake bugawa.
Lambobin jeri suna da irin wannan lahani saboda wani dalili. ID mai monotonic yana gaya maka jerin da aka raba ƙima, ba jerin da ma'amaloli suka commit ba. Ma'amalar da ta ɗauki ƙaramin lamba na iya commit bayan wadda ta ɗauki babban lamba, don haka cursor da ya dogara kan jerin rabo na iya barin rami.
Alƙawura biyar da rijuyar dole ta cika
Kafin ka zaɓi hanyar jigila, nemi tsarin tushe kwangila mai sashe biyar. Idan wani sashe ya ɓace, kana da hasashe ba rijuyar sauye-sauye ba.
- Ɗauki: saka, sabuntawa da gogewa, kowanne da mabuɗin tsayayye da ake buƙata don aiwatar da shi.
- Iyaka: abin da ƙimar cursor ke nufi da abin da batch mai daidaito ke ɗauka.
- Daidaito: yadda ake karanta tebura masu alaƙa ba tare da haɗa yanayin tushe marasa jituwa ba.
- Riƙewa: tsawon lokacin da mabukaci da ya katse zai iya ci gaba daga matsayinsa da aka ajiye.
- Sake farawa: cikakken snapshot da aka goyi bayan lokacin da wannan matsayi bai sake inganci ba.
Tsarin da aka goyi bayan zai iya cika duka biyar. Takardun SQL Server kan bin diddigin canje-canje misali ne na musamman da aka buga: yana ayyana mafi ƙarancin ingantaccen sigar, yana rubuta gogewa da canje-canje, kuma yana bayyana ma'amalar snapshot wadda ta ƙunshi tabbatarwa, ɗaukar siga da tambayoyin canje-canje masu alaƙa. Misali ne na abin da za ka buƙata daga tushe, ba rubutun da za ka manna a wata injin ba.
Tsara wurin dubawa a matsayin ɓangaren bututun
Matsayin da aka ajiye na mabukaci shine ainihin injin yanayi, don haka rubuta shi haka. Cursor na iya ci gaba ne kawai ta hanyar aikin da ya riga ya aiwatar da batch kuma ya commit ma'amalar manufa.
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
Idan isarwa ta kasa rabi, daidaita wannan batch maimakon ƙirƙirar sabon matsayin tushe. Sake fitarwa da sabon iyaka na sama shine yadda aiwatarwa na ɓangare ke zama rami na dindindin. Dokar madubi tana aiki a ɗaya gefen kuma: aiwatarwa mai idempotent a manufa yana hana kwafi kuma ba ya yin komai ga canjin da fitarwar ba ta taɓa gani ba.
Gogewa na buƙatar rubuce-rubuce, ba yanke hukunci ba
Kwatanta layukan da har yanzu suke ba zai iya gaya wa mabukaci waɗanne mabuɗi suka ɓace ba. Tushen da ba ya taɓa rubuta gogewa yana barin ka da zaɓuɓɓuka biyu marasa kamala: riƙe tarihin mabuɗi dadewa don diff, ko gudanar da cikakken daidaitawa bayyananne bisa jadawali. Dukansu zaɓin ƙira ne mai tsada, kuma babu ɗaya sai wani ya mallake shi.
Riƙewa irin wannan shawara ce. Kowace rijuyar canje-canje da aka goyi baya tana da taga; bayyana ta a cikin kwangilar kuma ka yi gargaɗi lokacin da wurin dubawa na mabukaci ya kusance ta. Mabukacin da ya farka bayan katsewar makonni biyu ya kamata ya karanta kuskure bayyananne "ana buƙatar sake farawa" maimakon karɓar batch na ɓangare cikin shiru.
Sannan auna ko delta ɗin ya cancanci
Komawa ga kwatanta kowanne mabuɗi da hash wani lokaci daidai ne, kuma ya cancanci sanin kuɗinsa. Har yanzu kana canja wurin bayanai game da kowanne layi, hash ba ya ba ka cikakken hoto mai daidaito a tsakanin tebura, kuma tsarin hash yana kawo tambayoyinsa game da wakilci da karo. Ƙananan bytes tare da iyaka mai tabbatarwa shine manufa; ƙananan bytes da ke barin canjin da aka commit ya ɓace cikin shiru ba delta ba ne kwata-kwata.
Rukunin gyaran ƙarshe alama ce. Cursor da ya tsira daga commit na jinkiri, gogewa da dogon katsewa kwangila ne.