Firebase-todennus- ja reaaliaikaisten tietokantasovellusten rakentaminen · Oppitunti

Transaktionaaliset dataoperaatiot

Opitte käyttämään transaktioita kilpailutilanteiden estämiseen ja kriittisten tietojen atomisten päivitysten varmistamiseen

Oppitunti 2/411 vaihetta

Transaktionaaliset dataoperaatiot on ilmainen Firebase-todennus- ja reaaliaikaisten tietokantasovellusten rakentaminen-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Firebase-todennus- ja reaaliaikaisten tietokantasovellusten rakentaminen-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Firebase-todennus- ja reaaliaikaisten tietokantasovellusten rakentaminen-kurssilla on yhteensä 4 oppituntia.

Miksi tietojen eheydellä on merkitystä

Reaaliaikaisissa sovelluksissa useat käyttäjät saattavat yrittää päivittää samoja tietoja samanaikaisesti. Jos tilannetta ei käsitellä oikein, seurauksena voi olla vakavia ongelmia, kuten tietojen vioittumista tai epäjohdonmukaisuuksia.

Ajatellaan verkkosivuston yksinkertaista laskuria. Jos kaksi käyttäjää napsauttaa Tykkää-painiketta täsmälleen samaan aikaan, laskurin pitäisi kasvaa kahdella, ei vain yhdellä.

Kilpailutilanneongelma

Ilman asianmukaista synkronointia voi ilmetä yleinen tilanne nimeltä kilpailutilanne. Siinä operaation lopputulos riippuu muiden operaatioiden ennakoimattomasta järjestyksestä tai ajoituksesta.

Jos esimerkiksi luette arvon, kasvatatte sitä ja kirjoitatte sen sitten takaisin, toinen käyttäjä saattaa lukea alkuperäisen arvon ennen kuin kirjoitatte kasvattamanne arvon. Tällöin päivitys voi kadota.

Firebase-transaktioiden esittely

Firebase Realtime Database tarjoaa transaktioiksi kutsutun tehokkaan ominaisuuden kilpailutilanteiden ratkaisemiseen ja tietojen eheyden varmistamiseen. Transaktio takaa atomisen päivityksen.

Atominen tarkoittaa, että operaatio suoritetaan joko kokonaan tai sitä ei suoriteta lainkaan. Se on kuin yksi jakamaton vaihe.

Miten `runTransaction` toimii

Transaktio käynnistetään DatabaseReference-olion runTransaction()-metodilla. Metodi ottaa vastaan Transaction.Handler-takaisinkutsun.

  • Firebase välittää tietojen nykyisen tilan käsittelijällenne.
  • Muokkaatte näitä tietoja käsittelijän sisällä.
  • Jos toinen asiakas kirjoittaa samaan sijaintiin transaktion suorituksen aikana, Firebase yrittää transaktiota automaattisesti uudelleen uusilla ajantasaisilla tiedoilla.

Turvallisen laskurin toteuttaminen

Tarkastellaan, miten laskuria kasvatetaan turvallisesti transaktion avulla. Näin laskuri pysyy aina oikeana, vaikka useat käyttäjät yrittäisivät kasvattaa sitä samanaikaisesti.

Kokeilkaa suorittaa tämä esimerkki:

public class Main {

  // Mock Firebase classes for demonstration
  static class MockFirebaseDatabase {
    private Integer value = 0; // Simulate data at a path
    public Integer get() { return value; }
    public void set(Integer val) { value = val; }

    public interface TransactionHandler {
      TransactionResult doTransaction(MutableData currentData);
    }

    public static class MutableData {
      private Integer data;
      public MutableData(Integer data) { this.data = data; }
      public Integer getValue() { return data; }
      public void setValue(Integer data) { this.data = data; }
    }

    public static class TransactionResult {
      private boolean success;
      private MutableData newData;
      private TransactionResult(boolean success, MutableData newData) {
        this.success = success;
        this.newData = newData;
      }
      public static TransactionResult success(MutableData newData) {
        return new TransactionResult(true, newData);
      }
      public static TransactionResult abort() {
        return new TransactionResult(false, null);
      }
      public boolean isSuccess() { return success; }
      public MutableData getNewData() { return newData; }
    }

    public void runTransaction(TransactionHandler handler) {
      // Simulate read, modify, and retry logic
      MutableData currentData = new MutableData(this.get());
      TransactionResult result = handler.doTransaction(currentData);

      if (result.isSuccess()) {
        this.set(result.getNewData().getValue());
        System.out.println("Transaction committed. New value: " + this.get());
      } else {
        System.out.println("Transaction aborted.");
      }
    }
  }

  public static void main(String[] args) {
    MockFirebaseDatabase counterRef = new MockFirebaseDatabase();
    counterRef.set(5); // Initial value

    counterRef.runTransaction(new MockFirebaseDatabase.TransactionHandler() {
      @Override
      public MockFirebaseDatabase.TransactionResult doTransaction(MockFirebaseDatabase.MutableData currentData) {
        Integer currentValue = currentData.getValue();
        if (currentValue == null) {
          currentValue = 0;
        }
        currentData.setValue(currentValue + 1);
        return MockFirebaseDatabase.TransactionResult.success(currentData);
      }
    });
  }
}

`MutableData`-olion ymmärtäminen

Transaction.Handler-käsittelijän sisällä MutableData-olio edustaa tietokannan siinä sijainnissa olevia tietoja, jota yritätte muokata.

  • Lukekaa olemassa oleva arvo komennolla currentData.getValue().
  • Asettakaa kirjoitettava uusi arvo komennolla currentData.setValue(newValue).

Muistakaa, että nämä ovat tiedot, jotka Firebase yrittää vahvistaa. Jos syntyy ristiriita, käsittelijää kutsutaan uudelleen päivitetyn MutableData-olion kanssa.

`TransactionResult` ja keskeyttäminen

MutableData-olion käsittelyn jälkeen käsittelijän on palautettava Transaction.Result:

  • Transaction.Result.success(mutableData): Ilmoittaa Firebaselle, että se yrittää vahvistaa mutableData-olion uuden arvon.
  • Transaction.Result.abort(): Ilmoittaa Firebaselle, että transaktio peruutetaan. Tämä on hyödyllistä, jos tiedot ovat odottamattomassa tilassa tai logiikkanne perusteella transaktion ei pitäisi jatkua.

Tässä on esimerkki transaktion keskeyttämisestä:

public class Main {

  // Mock Firebase classes (repeated for full program requirement)
  static class MockFirebaseDatabase {
    private Integer value = 0;
    public Integer get() { return value; }
    public void set(Integer val) { value = val; }

    public interface TransactionHandler {
      TransactionResult doTransaction(MutableData currentData);
    }

    public static class MutableData {
      private Integer data;
      public MutableData(Integer data) { this.data = data; }
      public Integer getValue() { return data; }
      public void setValue(Integer data) { this.data = data; }
    }

    public static class TransactionResult {
      private boolean success;
      private MutableData newData;
      private TransactionResult(boolean success, MutableData newData) {
        this.success = success;
        this.newData = newData;
      }
      public static TransactionResult success(MutableData newData) {
        return new TransactionResult(true, newData);
      }
      public static TransactionResult abort() {
        return new TransactionResult(false, null);
      }
      public boolean isSuccess() { return success; }
      public MutableData getNewData() { return newData; }
    }

    public void runTransaction(TransactionHandler handler) {
      MutableData currentData = new MutableData(this.get());
      TransactionResult result = handler.doTransaction(currentData);

      if (result.isSuccess()) {
        this.set(result.getNewData().getValue());
        System.out.println("Transaction committed. New value: " + this.get());
      } else {
        System.out.println("Transaction aborted.");
      }
    }
  }

  public static void main(String[] args) {
    MockFirebaseDatabase statusRef = new MockFirebaseDatabase();
    statusRef.set(1); // 1 = Active, 0 = Inactive

    // Try to change status, but abort if it's already Inactive (0)
    statusRef.runTransaction(new MockFirebaseDatabase.TransactionHandler() {
      @Override
      public MockFirebaseDatabase.TransactionResult doTransaction(MockFirebaseDatabase.MutableData currentData) {
        Integer status = currentData.getValue();
        if (status != null && status == 0) {
          System.out.println("Status is already Inactive. Aborting transaction.");
          return MockFirebaseDatabase.TransactionResult.abort();
        }
        // Change status to 0 (Inactive)
        currentData.setValue(0);
        return MockFirebaseDatabase.TransactionResult.success(currentData);
      }
    });
  }
}

Transaktion valmistumisen käsittely

runTransaction()-metodin kutsumisen jälkeen haluatte yleensä tietää, onnistuiko vai epäonnistuiko transaktio. Firebase tarjoaa tätä varten onComplete-takaisinkutsun.

Takaisinkutsu antaa käyttöön seuraavat tiedot:

  • error: Jos transaktio epäonnistui.
  • committed: Totuusarvo, joka ilmaisee, vahvistettiinko transaktio.
  • currentData: Tietojen lopullinen tila.

Käyttäkää tätä takaisinkutsua käyttöliittymän päivittämiseen tai transaktion jälkeisen logiikan käsittelyyn.

Yksinkertaisia laskureita pidemmälle

Transaktiot ovat korvaamattomia kaikissa tilanteissa, joissa tarvitaan vahvaa tietojen yhdenmukaisuutta:

  • Ainutlaatuiset käyttäjänimet: Varmistetaan käyttäjänimen ainutlaatuisuus ennen sen määrittämistä.
  • Äänestysjärjestelmät: Estetään äänestäminen useita kertoja tai varmistetaan äänimäärien oikeellisuus.
  • Varastonhallinta: Vähennetään varastomääriä turvallisesti ilman ylivarauksia.
  • Pelipisteet: Päivitetään ennätyspisteet luotettavasti moninpeleissä.

Pikatarkistus

Transaktiot ovat olennaisia tietojen eheyden säilyttämisessä samanaikaisessa käytössä. Mikä seuraavista kuvaa parhaiten Firebase Realtime Databasen transaktioiden ensisijaista hyötyä?

Kertaus ja seuraavat vaiheet

Olette oppineet, mikä merkittävä rooli transaktionaalisilla tietooperaatioilla on tietojen eheyden säilyttämisessä reaaliaikaisissa sovelluksissa.

  • Tarkastelimme kilpailutilanteita ja sitä, miksi ne aiheuttavat ongelmia.
  • Ymmärrätte nyt, miten Firebasen runTransaction()-metodi varmistaa atomiset päivitykset.
  • Näimme esimerkkejä laskurien turvallisesta kasvattamisesta ja Transaction.Result.abort()-metodin käytöstä.

Transaktiot ovat tehokas työkalu, mutta käyttäkää niitä harkiten, sillä ne voivat olla suoria kirjoitusoperaatioita hitaampia. Seuraavassa oppitunnissa tutustumme atomisiin laskureihin ja jonoihin!

Aloita maksutta

Opi Firebase-todennus- ja reaaliaikaisten tietokantasovellusten rakentaminen tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
11
Oppitunnit
44

Usein kysytyt kysymykset

Onko oppitunti ”Transaktionaaliset dataoperaatiot” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Firebase-todennus- ja reaaliaikaisten tietokantasovellusten rakentaminen-oppimispolun 3 oppituntia, myös oppitunnin “Transaktionaaliset dataoperaatiot”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Firebase-todennus- ja reaaliaikaisten tietokantasovellusten rakentaminen-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Transaktionaaliset dataoperaatiot”?

Opitte käyttämään transaktioita kilpailutilanteiden estämiseen ja kriittisten tietojen atomisten päivitysten varmistamiseen Harjoittelet Firebase-todennus- ja reaaliaikaisten tietokantasovellusten rakentaminen-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Firebase-todennus- ja reaaliaikaisten tietokantasovellusten rakentaminen-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Firebase-todennus- ja reaaliaikaisten tietokantasovellusten rakentaminen-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Transaktionaaliset dataoperaatiot”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Firebase-todennus- ja reaaliaikaisten tietokantasovellusten rakentaminen-oppitunnilla?

Kyllä. Jokainen Firebase-todennus- ja reaaliaikaisten tietokantasovellusten rakentaminen-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Fan-out-päivitykset
  2. Transaktionaaliset dataoperaatiot
  3. Atomiset laskurit ja jonot
  4. Denormalisointi ja tietojen monistamisen strategiat
← Takaisin: Firebase-todennus- ja reaaliaikaisten tietokantasovellusten rakentaminen