Java Academy · leksjon

Transaksjoner

Commit og rollback

Leksjon 3 av 413 trinn

Transaksjoner er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hva er en transaksjon?

En transaksjon grupperer flere SQL-operasjoner i én alt-eller-ingenting-enhet.

Enten lykkes alle setningene, og endringene gjøres permanente (commit), eller så oppstår det en feil, og alle endringene gjøres om (rollback). Dette holder databasen konsistent.

ACID på ett minutt

Transaksjoner gir ACID-garantiene:

  • Atomisitet — alt eller ingenting.
  • Konsistens — flytter databasen fra én gyldig tilstand til en annen.
  • Isolasjon — samtidige transaksjoner ødelegger ikke hverandre.
  • Varighet — etter commit overlever endringene en krasj.

Auto-commit-modus

JDBC-tilkoblinger kjører som standard i auto-commit-modus: hver SQL-setning er sin egen transaksjon og committes umiddelbart.

Det fungerer fint for enkeltstående setninger, men er ubrukelig når flere skriveoperasjoner må lykkes samlet. Slå av auto-commit for å styre transaksjonene selv.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://localhost:5432/bank";
        try (Connection conn = DriverManager.getConnection(url, "app", "secret")) {
            System.out.println("Default auto-commit: " + conn.getAutoCommit());
            conn.setAutoCommit(false);
            System.out.println("Now manual: " + conn.getAutoCommit());
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

Commit og rollback

Når auto-commit er slått av, bestemmer du grensene:

  • conn.commit() gjør alle ventende endringer permanente.
  • conn.rollback() forkaster dem.

Det klassiske eksempelet er en pengeoverføring: Trekk beløpet fra én konto og sett det inn på en annen. Begge operasjonene må utføres, eller ingen av dem.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://localhost:5432/bank";
        String debit = "UPDATE account SET balance = balance - ? WHERE id = ?";
        String credit = "UPDATE account SET balance = balance + ? WHERE id = ?";
        try (Connection conn = DriverManager.getConnection(url, "app", "secret")) {
            conn.setAutoCommit(false);
            try (PreparedStatement d = conn.prepareStatement(debit);
                 PreparedStatement c = conn.prepareStatement(credit)) {
                d.setInt(1, 100); d.setInt(2, 1); d.executeUpdate();
                c.setInt(1, 100); c.setInt(2, 2); c.executeUpdate();
                conn.commit();
                System.out.println("Transfer committed");
            } catch (SQLException ex) {
                conn.rollback();
                System.out.println("Rolled back: " + ex.getMessage());
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

Mønsteret rollback ved feil

Dette er strukturen du bør huske:

  • Slå av auto-commit.
  • Gjør arbeidet i en indre try-blokk.
  • Kall commit() hvis alt lykkes.
  • Kall rollback() i catch, og kast feilen videre eller logg den.

Uten rollback kan en feil føre til at databasen blir delvis oppdatert.

Simulering av atomisitet

Her modelleres alt-eller-ingenting-prinsippet i ren Java, slik at eksempelet kan kjøres alene. Vi utfører to oppdateringer på et øyeblikksbilde. Hvis en av dem mislykkes, gjenoppretter vi øyeblikksbildet.

public class Main {
    public static void main(String[] args) {
        int[] balances = {500, 300};
        int[] backup = balances.clone();
        try {
            balances[0] -= 200;
            if (balances[0] < 0) throw new IllegalStateException("insufficient funds");
            balances[1] += 200;
            System.out.println("Commit: " + balances[0] + ", " + balances[1]);
        } catch (RuntimeException e) {
            balances = backup;
            System.out.println("Rollback: " + balances[0] + ", " + balances[1]);
        }
    }
}

Savepoints

Et savepoint er en markør inne i en transaksjon. Du kan rulle tilbake til markøren uten å forkaste hele transaksjonen.

  • Savepoint sp = conn.setSavepoint()
  • conn.rollback(sp) gjør bare arbeidet etter dette punktet om.

Dette er nyttig for delvis gjenoppretting i lange transaksjoner.

Isolasjonsnivåer

Isolasjon styrer hva én transaksjon kan se av en annens ubekreftede arbeid. JDBC definerer nivåene via conn.setTransactionIsolation(...):

  • TRANSACTION_READ_COMMITTED — det vanlige standardnivået.
  • TRANSACTION_REPEATABLE_READ
  • TRANSACTION_SERIALIZABLE — sterkest, men tregest.

Høyere isolasjon hindrer anomalier, men reduserer samtidigheten.

Leseanomalier

Lavere isolasjonsnivåer kan tillate:

  • Skitten lesing — å se en annen transaksjons ubekreftede endring.
  • Ikke-gjentakbar lesing — en rad endres mellom to lesinger.
  • Fantomlesing — nye rader dukker opp som samsvarer med en tidligere spørring.

Velg det laveste nivået som likevel hindrer anomaliene logikken ikke kan tåle.

Gjenopprett auto-commit

Hvis tilkoblingen ble lånt fra en connection pool, må du gjenopprette den opprinnelige tilstanden før du leverer den tilbake.

Etter en manuell transaksjon setter du conn.setAutoCommit(true) igjen, eller tilbakestiller til verdien du så da tilkoblingen ble lånt, slik at neste bruker ikke blir overrasket av innstillingene dine.

Hold transaksjonene korte

En transaksjon holder låser til den committer eller rulles tilbake. Lange transaksjoner blokkerer annet arbeid og øker risikoen for vranglåser.

  • Ikke utfør langsomme nettverkskall eller be om brukerinndata i en åpen transaksjon.
  • Samle inn dataene først, og åpne deretter transaksjonen, skriv og commit raskt.

Korte, fokuserte transaksjoner skalerer langt bedre.

Hurtigsjekk

Hva er effekten av å kalle connection.rollback()?

Oppsummering

Transaksjoner gir sikkerhet gjennom alt-eller-ingenting-prinsippet:

  • Slå av auto-commit med setAutoCommit(false).
  • Kall commit() ved suksess og rollback() ved feil.
  • Bruk savepoints for delvis rollback.
  • Juster isolasjonsnivåene for å balansere korrekthet og samtidighet.
  • Gjenopprett auto-commit før du leverer tilbake en tilkobling fra en connection pool.
Gratis å komme i gang

Lær deg Java med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
104
Leksjoner
374

Ofte stilte spørsmål

Er leksjonen «Transaksjoner» gratis?

Ja – hele teksten i «Transaksjoner» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Transaksjoner»?

Commit og rollback Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Java Academy?

Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Transaksjoner»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?

Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Grunnleggende JDBC
  2. PreparedStatement
  3. Transaksjoner
  4. Tilkoblingspooling med HikariCP
← Tilbake til Java Academy