Python Academy · Oppitunti

Transaktiot ja kontekstinhallinta

Vahvista ja peruuta turvallisesti

Oppitunti 4/413 vaihetta

Transaktiot ja kontekstinhallinta on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/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 Python Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Python Academy-kurssilla on yhteensä 4 oppituntia.

Mikä on transaktio?

Transaktio ryhmittelee useita lauseita niin, että ne joko kaikki onnistuvat tai kaikki epäonnistuvat yhdessä. Tämä pitää tiedot yhdenmukaisina.

SQLite aloittaa transaktion automaattisesti ennen tietoja muuttavia lauseita.

import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
print('Table ready for transactions')
conn.close()

Muutosten tallentaminen

Muutokset eivät ole pysyviä, ennen kuin kutsutte funktiota conn.commit(). Sitä ennen ne ovat olemassa vain nykyisessä transaktiossa.

import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
cur.execute('INSERT INTO accounts (balance) VALUES (100)')
conn.commit()
print('Committed')
conn.close()

Muutosten peruuttaminen

conn.rollback() kumoaa kaikki viimeisimmän commitin jälkeen tehdyt muutokset. Käyttäkää sitä, kun jokin menee pieleen.

import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
conn.commit()
cur.execute('INSERT INTO accounts (balance) VALUES (100)')
conn.rollback()
cur.execute('SELECT COUNT(*) FROM accounts')
print('Rows after rollback:', cur.fetchone()[0])
conn.close()

Rahansiirto

Transaktiot ovat erityisen hyödyllisiä, kun useiden päivitysten on pysyttävä synkronoituina. Pankkisiirrossa vähennetään rahaa yhdeltä tililtä ja lisätään toiselle. Molempien on tapahduttava tai kummankaan ei pidä tapahtua.

import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
cur.execute('INSERT INTO accounts (id, balance) VALUES (1, 100)')
cur.execute('INSERT INTO accounts (id, balance) VALUES (2, 50)')
cur.execute('UPDATE accounts SET balance = balance - 30 WHERE id = 1')
cur.execute('UPDATE accounts SET balance = balance + 30 WHERE id = 2')
conn.commit()
cur.execute('SELECT id, balance FROM accounts')
print(cur.fetchall())
conn.close()

Virheiden käsittely try/except-rakenteella

Käärikää transaktio try/except-rakenteeseen. Virheen sattuessa perukaa muutokset, jotta osittaiset muutokset eivät vioita tietojanne.

import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
try:
    cur.execute('INSERT INTO accounts (id, balance) VALUES (1, 100)')
    cur.execute('INSERT INTO accounts (id, balance) VALUES (1, 200)')
    conn.commit()
except sqlite3.IntegrityError:
    conn.rollback()
    print('Rolled back after error')
conn.close()

Yhteys kontekstinhallintana

Käytettäessä rakennetta with conn: muutokset vahvistetaan automaattisesti onnistumisen jälkeen ja perutaan, jos lohkon sisällä tapahtuu poikkeus.

import sqlite3
conn = sqlite3.connect(':memory:')
conn.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
with conn:
    conn.execute('INSERT INTO accounts (balance) VALUES (100)')
print('Auto-committed via with block')
conn.close()

Automaattinen palautus poikkeuksen yhteydessä

Jos with conn:-lohko aiheuttaa poikkeuksen, transaktio perutaan automaattisesti. Huomioikaa, että yhteys itsessään jää auki.

import sqlite3
conn = sqlite3.connect(':memory:')
conn.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY)')
try:
    with conn:
        conn.execute('INSERT INTO accounts (id) VALUES (1)')
        conn.execute('INSERT INTO accounts (id) VALUES (1)')
except sqlite3.IntegrityError:
    print('Block rolled back automatically')
count = conn.execute('SELECT COUNT(*) FROM accounts').fetchone()[0]
print('Rows:', count)
conn.close()

closing() yhteyden sulkemiseen

contextlib.closing-apuohjelma takaa, että close()-funktiota kutsutaan lohkon päättyessä ja yhteys vapautetaan.

import sqlite3
from contextlib import closing
with closing(sqlite3.connect(':memory:')) as conn:
    conn.execute('CREATE TABLE t (id INTEGER)')
    print('Used inside closing()')
print('Connection closed automatically')

Molempien tapojen yhdistäminen

Sijoittakaa with conn: rakenteen closing(...) sisään, jotta voitte hallita transaktiota ja varmistaa yhteyden sulkeutumisen.

import sqlite3
from contextlib import closing
with closing(sqlite3.connect(':memory:')) as conn:
    conn.execute('CREATE TABLE t (id INTEGER, v TEXT)')
    with conn:
        conn.execute('INSERT INTO t VALUES (1, ?)', ('hello',))
    print(conn.execute('SELECT * FROM t').fetchall())

isolation_level

Yhteyden isolation_level määrittää, milloin transaktiot alkavat. Oletusasetuksella SQLite hallitsee tätä itse; arvon None asettaminen ottaa käyttöön autocommit-tilan.

import sqlite3
conn = sqlite3.connect(':memory:')
print('Default isolation_level:', repr(conn.isolation_level))
conn.isolation_level = None
print('Now autocommit:', conn.isolation_level)
conn.close()

Miksi transaktiot ovat tärkeitä

Ilman transaktioita kaatuminen kesken päivityksen voisi jättää tiedot puolivalmiiksi. Transaktiot tekevät muutossarjasta atomisen: jakamattoman. Tämä suojaa tietojen eheyttä.

import sqlite3
conn = sqlite3.connect(':memory:')
conn.execute('CREATE TABLE log (msg TEXT)')
with conn:
    conn.execute('INSERT INTO log VALUES (?)', ('all or nothing',))
print('Atomic write done')
conn.close()

Pikatesti

Testatkaa transaktioita koskevaa osaamistanne.

Kertaus

Olette oppineet hallitsemaan transaktioita turvallisesti.

  • commit() tallentaa muutokset; rollback() kumoaa ne
  • Käärikää riskialttiit kirjoitusoperaatiot try/except-rakenteeseen ja käyttäkää peruutusta
  • with conn: vahvistaa muutokset tai peruu ne automaattisesti
  • contextlib.closing takaa yhteyden sulkeutumisen
Aloita maksutta

Opi Python 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
76
Oppitunnit
320

Usein kysytyt kysymykset

Onko oppitunti ”Transaktiot ja kontekstinhallinta” ilmainen?

Kyllä – oppitunnin ”Transaktiot ja kontekstinhallinta” 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 Python Academy-kurssin, päivitä CoddyKit PROhon. Python Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Transaktiot ja kontekstinhallinta”?

Vahvista ja peruuta turvallisesti Harjoittelet Python Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Python Academy-opiskelun?

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

Kuinka kauan ”Transaktiot ja kontekstinhallinta”-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ä Python Academy-oppitunnilla?

Kyllä. Jokainen Python 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.

Kaikki tämän kurssin oppitunnit

  1. Yhteyden muodostaminen ja taulukoiden luominen
  2. Insert, Select, Update, Delete
  3. Parametrisoidut kyselyt
  4. Transaktiot ja kontekstinhallinta
← Takaisin: Python Academy