Andrise programmeerimisalane WIKI

Transaktsioonid

Transaktsioonid on päringute grupid, mis kas õnnestuvad täielikult või kukuvad kõik läbi. Kui mingi päring ebaõnnestub (andmebaasis tekib viga, olgu selleks ajalimiidi ületamine vms.), siis võetakse tagasi kõik senini transaktsiooni käigus tehtud päringud. Nii ei jää andmebaasi ripakile poolikuid elemente.

Näiteks mingi suure faili meta-info on ühest tabelist maha võetud, aga faili ennast teisest tabelist maha võtta ei õnnestunud ja see jäigi „igavesti“ sinna rippuma. Või rahaülekande puhul võeti ülekandjalt andmebaasis saldot ülekande võrra väiksemaks, aga saaja saldo jäi samaks, kuna selle suurendamise päring kukkus läbi. Kõigi nende probleemide vastu aitavadki transaktsioonid.

Transaktsioonid käivitatakse funktsiooniga db.run_in_transaction(func, [pos[, kwds]]) kus func tähistab transaktsiooni sisaldavat funktsiooni, pos funktsioonile edastatav positsiooniargument (näiteks võti kindla elemendi juurde, millega transaktsioon tehakse) ning kwds täiendavad võtmesõna argumente, mida saab kasutada transaktsiooni teostamiseks.

def uuenda_kasutajat(key, nimi):
  kasutaja = Kasutaja.get(key)
  kasutaja.nimi = nimi
  kasutaja.put()
 
class UuendaHandler(webapp.RequestHandler):
  def get(self):
    key = self.request.get('key')
    nimi = self.request.get('nimi')
    db.run_in_transaction(uuenda_kasutajat, key, nimi)

Juhul kui transaktsioon ebaõnnestub, proovitakse seda kolm korda veel algusest peale käivitada. Kui siis ikka ei õnnestu, tõstetakse TransactionFailedError veateade.

Transaktsioonide kohta saab lähemalt lugeda Google App Engine transaktsioonide dokumentatsioonist.