Tietokantojen välinen siirto kuolee, kun VPN katkeaa, eikä „aja se uudelleen“ ole palautussuunnitelma. Lähdekohtainen poiminta voi olla valmis, kohde on voinut jo commitoida tai vastaus on yksinkertaisesti voinut kadota paluumatkalla. Nämä kolme tilaa vaativat eri toimenpiteitä, eikä asiakas, joka tuntee vain „virheen“, pysty erottamaan niitä toisistaan.

Ratkaisu on arkkitehtoninen: anna jokaiselle ajolle kestävä eräidentiteetti ja anna tietokantojen vastata kysymyksiin sen sijaan, että asiakas arvaisi.

Mitä tietokanta todella takaa

SQL Server ja Oracle antavat molemmat atomisuuden transaktion sisällä. Kumpikaan ei anna atomisuutta niiden kahden välillä. Kadonnut yhteys ei turmele tietokantaa eikä pakota manuaalista peruutusta, koska palvelin ratkaisee oman transaktionsa ilman sinua. Se, mikä rikkoutuu, on kutsujan tieto lopputuloksesta.

Erikseen commitoitu tarkoittaa erikseen commitoitua. VPN, joka kuljettaa molemmat yhteydet, ei sulata kahta commitia yhdeksi työyksiköksi.

Commit, josta et koskaan kuullut

Yksi vikamuoto rankaisee naiivia uudelleenyrityslogiikkaa: palvelin commitoi, eikä kuittaus koskaan saavuta kutsujaa. Oracle dokumentoi tämän tuntemattoman tuloksen ongelmaksi ja tarjoaa siihen Transaction Guardin transaktiodokumentaatiossa. Viestintävirhe ei ole todiste siitä, että lähetetty commit epäonnistui, ja sen käsitteleminen todisteena on tapa, jolla erä lähetetään kahdesti. Ero on tärkein uudelleenyrityspolulla, jossa operaattorilla on virheilmoitus eikä mitään muuta signaalia, jonka perusteella toimia.

Siksi palautusvaiheen on luettava tulos kohteesta sen sijaan, että se pääteltäisiin virhetekstistä.

Anna siirrolle eräidentiteetti

Jokainen ajo saa muuttumattoman erätunnisteen, ja kohde kirjaa, mitä se teki sillä tunnisteella. Elinkaari on neljä vaihetta, ja se näyttää samalta toimittajasta riippumatta:

  1. Poimi tunnistettu, muuttumaton lähde-erä, jolla on kirjattu skeema ja raja.
  2. Siirrä se kohteen valmistelualueelle ja havaitse puutteellinen tai ristiriitainen sisältö ennen kuin se julistetaan valmiiksi.
  3. Käytä sitä kohteen omien ainutlaatuisuus- tai lukitussääntöjen mukaisesti ja kirjaa valmistuminen samassa paikallisessa transaktiossa.
  4. Täsmäytä kestävä tulos tuetun protokollan kautta ennen kuittausta tai uudelleenyritystä.

Uudelleenyritykset käyttävät samaa tunnistetta. Uusi tunniste jokaista yritystä kohden vesittää juuri rakentamasi kaksoiskappaleiden eston, mikä kuulostaa ilmeiseltä, kunnes uudelleenyrityskääre luo sellaisen automaattisesti.

Tunniste antaa sinulle myös jotain, mitä vasten täsmäyttää myöhemmin, kauan sen jälkeen kun asiakasprosessi on poissa.

Varaa erä itsellesi ja käytä se sitten

Soveltamisvaiheen on varattava erätunniste, tehtävä liiketoimintamuutokset ja kirjattava valmistuminen yhdessä paikallisessa transaktiossa. Tarkistuksen ja lisäyksen tekeminen erillisinä lauseina palauttaa kilpajuoksun, jonka yritit poistaa. Jos kaksi työntekijää kilpailee, täsmälleen yksi varaus voittaa ja toiselle kerrotaan siitä.

Puuttuva valmistumistietue ei ole todiste siitä, että käynnissä oleva transaktio ei koskaan commitoisi. Varauksen on serialisoitava kilpailevat yritykset, tai protokollan on luettava kestävä tulos ennen minkään päättämistä.

Käytä kyseiseen serialisointiin tietokannan tuettua mekanismia sen sijaan, että sovelluskoodissa olisi tarkista-ja-toista-silmukka.

Mitä suunnittelu ei vieläkään voi luvata

Valmistelu tekee työstä uudelleenkäynnistettävän ja vähentää riippuvuutta yhdestä pitkäikäisestä istunnosta. Se ei luo yhtä atomaarista commitia SQL Serverin, Oraclen ja minkä tahansa työn suorittaman ulkoisen sivuvaikutuksen yli. Jos liiketoiminta todella tarvitsee sitä, suunnittele ja kvalifioi tuettu hajautettu transaktio tai täsmäytysprosessi, mukaan lukien se, kuka omistaa epävarman tuloksen työn. Kaikki sitä heikompi kuuluu täsmäytyksen runbookiin, ei siirtokoodiin.

Hyväksy keskeytys kolmessa paikassa: siirron aikana, soveltamisen aikana ja commitin jälkeen mutta ennen kuittausta. Tarkista sitten liiketoiminnan tulos asiakkaan viestin sijaan ja anna eräkirjan kertoa, onko työ kesken, commitoitu vai vielä ratkaisematon.

Aiheeseen liittyvät artikkelit