Meerdere wijzigingen, één uitkomst · oefening
Draai de hele poging terug
De aanroep met een ontbrekend lid heeft nu een benoemde fout: sqlite3.IntegrityError. De eerdere insert wacht nog op afronding, dus de functie moet een expliciete beslissing nemen bij mislukking.
Open transactions.py. Zet de twee inserts, de commit en de succesvolle return in één try-blok. Voeg daarna deze specifieke handler toe:
except sqlite3.IntegrityError:
connection.rollback()
return False
rollback() verwerpt wijzigingen die op deze verbinding nog op afronding wachten. Het verwijdert geen oude gecommitte uitleningen. Hier verwijdert het uitlening 7101, het geldige eerste deel van het mislukte paar.
Laat connection.commit() na beide inserts in de succesvolle tak staan. Het volledige gedrag is nu:
| Uitkomst | Transactiebeslissing | Teruggegeven waarde |
|---|---|---|
| Beide inserts slagen | Beide committen | True |
| Een van beide inserts schendt een integriteitsregel | Wachtend werk terugdraaien | False |
Druk op Run. Het geldige blok moet na heropenen nog steeds de ID’s [7001, 7002] tonen. Het blok met het ontbrekende lid moet nu False melden, zonder ontsnappende database-regelfout en met lege voorgestelde ID’s op beide verbindingen.
De handler vangt alleen sqlite3.IntegrityError op. Vang niet Exception of alle sqlite3.Error-waarden op. Als er een ander defect optreedt, zoals ongeldige SQL of een onbruikbaar Python-argument, zou False teruggeven het op de bekende catalogusuitkomst laten lijken. Die losstaande fout moet zichtbaar blijven.
Submit zet de ongeldige rij in het ene geval eerst en in het andere als tweede. Het begint ook met andere gecommitte rijen en controleert of die blijven staan. Een rollback moet dit voorgestelde paar afhandelen, niet de tabel leegmaken. Tot slot voert het een onschuldige query uit via de meegegeven verbinding, omdat het afronden van de transactie het eigenaarschap van de verbinding niet aan deze functie overdraagt.
Deze handmatige vertakking is correct en nuttig om één keer te zien. Je kunt dezelfde resultaten behouden en de normale commit- en rollbackbeslissingen aan de verbinding overlaten.
Opdracht
Werk checkout_pair bij zodat een geldig paar wordt gecommit en True teruggeeft. Vang alleen sqlite3.IntegrityError op; draai de wachtende poging terug en geef False terug.
Behoud bestaande gecommitte rijen, laat losstaande fouten ontsnappen en laat de meegegeven verbinding open.