'n Kruis-databasis-oordrag sterf wanneer die VPN wegval, en "probeer weer" is nie 'n herstelplan nie. Die bron-onttrekking is dalk voltooi, die teiken het dalk reeds commit gedoen, of die antwoord het dalk net op die terugpad verlore gegaan. Daardie drie toestande vereis verskillende aksies, en 'n kliënt wat net "fout" ken, kan hulle nie onderskei nie.

Die oplossing is argitektonies: gee elke lopie 'n duursame bondel-identiteit, en laat die databasisse vrae antwoord eerder as om die kliënt te laat raai.

Wat die databasis werklik waarborg

SQL Server en Oracle gee albei atomisiteit binne 'n transaksie. Nie een gee vir jou atomisiteit oor albei nie. 'n Verlore verbinding beskadig nie die databasis nie, en dit dwing ook nie 'n handmatige terugrol nie, want die bediener besleg sy eie transaksie sonder jou. Wat breek, is die oproeper se kennis van die uitkoms.

Apart commit beteken apart commit. 'n VPN wat albei verbindings dra, smelt nie twee commits saam in een werkseenheid nie.

Die commit waarvan jy nooit gehoor het nie

Een foutmodus straf naïewe herprobeerlogika: die bediener commit, en die bevestiging bereik nooit die oproeper nie. Oracle dokumenteer dit as die probleem van onbekende uitkoms en verskaf Transaction Guard daarvoor in die transaksiedokumentasie. 'n Kommunikasiefout is nie bewys dat 'n ingedien commit misluk het nie, en om dit as bewys te behandel, is hoe 'n bondel twee keer gepos word. Die onderskeid is die belangrikste op die herprobeerpad, waar die operateur 'n foutboodskap het en geen ander sein om op te handel nie.

Dus moet die herstelstap die uitkoms by die teiken lees eerder as om dit uit die foutteks af te lei.

Gee die oordrag 'n bondel-identiteit

Elke lopie kry 'n onveranderlike bondel-ID, en die teiken teken aan wat hy met daardie ID gedoen het. Die lewensiklus het vier stappe, en dit lyk dieselfde ongeag die verskaffer:

  1. Onttrek 'n geïdentifiseerde, onveranderlike bronbondel met 'n opgetekende skema en grens.
  2. Dra oor dit na die teiken se staging-area en bespeur onvolledige of botsende inhoud voordat dit gereed verklaar word.
  3. Pas toe dit onder die teiken se eie uniekheid- of sluitreëls en teken voltooiing in dieselfde plaaslike transaksie aan.
  4. Versoen die duursame uitkoms deur die ondersteunde protokol voordat jy bevestig of weer probeer.

Herprobeerpogings hergebruik die ID. 'n Nuwe ID per poging verydel die duplikaatvoorkoming wat jy pas gebou het, wat voor die hand liggend klink totdat 'n herprobeer-omhulsel outomaties een genereer.

Die ID gee jou ook iets om later teen te versoen, lank nadat die kliëntproses weg is.

Eis die bondel op, pas dan toe

Die toepassingstap moet die bondel-ID opeis, die besigheidswysigings maak en voltooiing in een plaaslike transaksie aanteken. Om die kontrole en die invoeging as afsonderlike stellings te doen, herstel die wedloop wat jy probeer verwyder het. As twee werkers meeding, wen presies een opeising en die ander word daarvan verwittig.

'n Afwesige voltooiingsrekord is nie bewys dat 'n transaksie wat aan die gang is nooit sal commit nie. Die opeising moet mededingende pogings serialiseer, of die protokol moet die duursame uitkoms lees voordat enigiets besluit word.

Gebruik die databasis se ondersteunde meganisme vir daardie serialisering eerder as 'n kontroleer-dan-herhaal-lus in toepassingskode.

Wat die ontwerp steeds nie kan belowe nie

Staging maak die werk hervatbaar en verminder afhanklikheid van een langdurige sessie. Dit skep nie 'n enkele atomiese commit oor SQL Server, Oracle en watter eksterne newe-effek die taak ook uitvoer nie. As die besigheid dit werklik nodig het, ontwerp en kwalifiseer dan 'n ondersteunde verspreide transaksie of 'n versoeningsproses, insluitend wie die werk besit waaroor onsekerheid bestaan. Enigiets swakker as dit hoort in 'n versoeningsrunbook, nie in die oordragkode nie.

Aanvaar onderbreking op drie plekke: tydens oordrag, tydens toepassing, en ná commit maar voor bevestiging. Kontroleer dan die besigheidsresultaat eerder as die kliënt se boodskap, en laat die bondelgrootboek sê of die werk onvolledig, gecommit of steeds onopgelos is.

Verwante artikels