Transaktiot
Commit ja rollback.
Transaktiot on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.
Mikä on transaktio?
Transaktio ryhmittelee useita SQL-operaatioita yhdeksi kokonaisuudeksi, joka joko suoritetaan kokonaan tai ei lainkaan.
Joko jokainen lause onnistuu ja muutokset tehdään pysyviksi (commit), tai jokin epäonnistuu ja kaikki muutokset perutaan (rollback). Näin tietokanta pysyy eheänä.
ACID minuutissa
Transaktiot tarjoavat ACID-takaukset:
- Atomisuus — kaikki tai ei mitään.
- Eheys — siirtää tietokannan yhdestä kelvollisesta tilasta toiseen.
- Eristys — samanaikaiset transaktiot eivät turmele toistensa tietoja.
- Pysyvyys — vahvistamisen jälkeen muutokset säilyvät kaatumisesta huolimatta.
Auto-commit-tila
JDBC-yhteydet toimivat oletusarvoisesti auto-commit-tilassa: jokainen lause muodostaa oman transaktionsa ja vahvistetaan heti.
Yksittäisille lauseille tämä sopii, mutta siitä ei ole hyötyä, kun useiden kirjoitusoperaatioiden on onnistuttava yhdessä. Jos haluatte hallita transaktioita itse, kytkekää auto-commit pois käytöstä.
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 ja rollback
Kun auto-commit on poissa käytöstä, päätätte transaktioiden rajat:
conn.commit()tekee kaikki odottavat muutokset pysyviksi.conn.rollback()hylkää ne.
Klassinen esimerkki on rahansiirto: veloittakaa yksi tili ja hyvittäkää toista. Molempien on tapahduttava tai kummankaan ei.
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());
}
}
}Virheen jälkeinen rollback-malli
Muistettava rakenne:
- Poistakaa auto-commit käytöstä.
- Tehkää työ sisemmän
try-lohkon sisällä. - Kutsukaa onnistumisen jälkeen
commit()-metodia. - Kutsukaa
catch-lohkossarollback()-metodia ja heittäkää poikkeus uudelleen tai kirjatkaa se lokiin.
Ilman rollbackia virhe voi jättää tietokannan osittain päivitettyyn tilaan.
Atomisuuden simulointi
Tässä kaikki tai ei mitään -periaate on mallinnettu pelkällä Javalla, jotta esimerkki voidaan suorittaa itsenäisesti. Teemme kaksi päivitystä tilannevedokseen; jos jompikumpi epäonnistuu, palautamme tilannevedoksen.
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]);
}
}
}Savepointit
Savepoint on transaktion sisäinen merkki. Voitte palauttaa transaktion siihen hylkäämättä koko transaktiota.
Savepoint sp = conn.setSavepoint()conn.rollback(sp)peruu vain kyseisen kohdan jälkeen tehdyn työn.
Se on hyödyllinen osittaiseen palautumiseen pitkissä transaktioissa.
Eristystasot
Eristys määrittää, mitä yksi transaktio näkee toisen transaktion vahvistamattomista muutoksista. JDBC määrittää tasot menetelmällä conn.setTransactionIsolation(...):
TRANSACTION_READ_COMMITTED— yleisin oletus.TRANSACTION_REPEATABLE_READTRANSACTION_SERIALIZABLE— vahvin ja hitain.
Suurempi eristystaso estää anomalioita, mutta vähentää samanaikaisuutta.
Lukuanomaliat
Alhaisemmat eristystasot voivat sallia seuraavat ilmiöt:
- Likainen luku — toisen transaktion vahvistamattoman muutoksen näkeminen.
- Toistumaton luku — rivi muuttuu kahden lukukerran välillä.
- Haamuluku — aiempaa kyselyä vastaavia uusia rivejä ilmestyy.
Valitkaa alin taso, joka estää logiikan kannalta sietämättömät anomaliat.
Palauta auto-commit
Jos lainasitte yhteyden poolista, palauttakaa sen alkuperäinen tila ennen kuin annatte sen takaisin pooliin.
Kun manuaalinen transaktio on päättynyt, asettakaa conn.setAutoCommit(true) uudelleen (tai palauttakaa yhteys lainattaessa havaitsemaanne arvoon), jotta seuraava käyttäjä ei joudu yllättymään asetuksistanne.
Pitäkää transaktiot lyhyinä
Transaktio pitää lukot varattuina, kunnes se vahvistetaan tai perutaan. Pitkät transaktiot estävät muuta työtä ja lisäävät lukkiutumisen riskiä.
- Älkää tehkö hitaita verkkokutsuja tai pyytäkö käyttäjältä syötettä avoimen transaktion aikana.
- Kerätkää tiedot ensin, avatkaa sitten yhteys, tehkää kirjoitus ja commit nopeasti.
Lyhyet ja kohdennetut transaktiot skaalautuvat paljon paremmin.
Pikatarkistus
Mikä vaikutus on kutsulla connection.rollback()?
Kertaus
Transaktiot tarjoavat kaikki tai ei mitään -suojan:
- Poistakaa auto-commit käytöstä komennolla
setAutoCommit(false). - Kutsukaa onnistumisen jälkeen
commit()-metodia ja virheen jälkeenrollback()-metodia. - Käyttäkää savepoint-pisteitä osittaiseen palautukseen.
- Säätäkää eristystasoja oikeellisuuden ja samanaikaisuuden tasapainottamiseksi.
- Palauttakaa auto-commit ennen kuin annatte poolatun yhteyden takaisin pooliin.
Opi Java 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
- 104
- Oppitunnit
- 374
Usein kysytyt kysymykset
Onko oppitunti ”Transaktiot” ilmainen?
Kyllä – oppitunnin ”Transaktiot” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Transaktiot”?
Commit ja rollback. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”Transaktiot”-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ä Java Academy-oppitunnilla?
Kyllä. Jokainen Java Academy-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.