SQL-transacties en ACID uitgelegd: COMMIT-, ROLLBACK- en isolatieniveaus

  1. Home
  2. Blog
  3. Databases en SQL

Databases en SQL

SQL-transacties en ACID uitgelegd: COMMIT, ROLLBACK en isolatieniveaus

Wat gebeurt er als de server halverwege faalt tijdens het verplaatsen van geld tussen twee accounts? Transacties zijn het antwoord. Bekijk hoe ze aan een echt voorbeeld werken, wat ACID betekent en hoe je een isolatieniveau kiest.

9 min leestijd
SQL-transacties en ACID uitgelegd: COMMIT, ROLLBACK en isolatieniveaus

Belangrijkste punten

  • Een transactie groepeert instructies zodat ze allemaal samen slagen of allemaal samen mislukken.
  • COMMIT maakt de wijzigingen permanent en ROLLBACK annuleert ze.
  • ACID staat voor atomiciteit, consistentie, isolatie en duurzaamheid.
  • Een sterkere isolatie voorkomt meer afwijkingen, maar kan de gelijktijdigheid verminderen, dus kies bewust.

Het verplaatsen van 300 roepies van Asha naar Ben vergt twee updates: trek het af van het ene account en voeg het toe aan het andere. Als het systeem tussen hen faalt, verdwijnt het geld. SQL-transacties bestaan ​​om dat onmogelijk te maken, door beide stappen als één geheel te behandelen.

In deze handleiding bespreken we commits, rollbacks en mislukkingen in een kleine rekeningtabel. We hebben die voorbeelden in SQLite uitgevoerd en de getoonde saldi komen uit die run. De basisopdrachten zijn voor alle databases vergelijkbaar, maar het vergrendelings- en isolatiegedrag varieert sterk. Daarom geven we aan waar u de documentatie van uw eigen database kunt raadplegen.

Wat is een transactie?

Een transactie is een reeks van een of meer SQL-instructies die door de database als één logische bewerking worden behandeld. Hier is onze tabel:

CREATE TABLE accounts (
  id INT PRIMARY KEY,
  owner TEXT,
  balance INT CHECK (balance >= 0)
);

INSERT INTO accounts VALUES (1, 'Asha', 1000), (2, 'Ben', 200);

De CHECK beperking is een regel dat een saldo nooit onder nul kan komen, die we later zullen gebruiken. Merk op dat de syntaxis om een ​​transactie te starten varieert: SQLite en PostgreSQL accepteren BEGIN, MySQL heeft ook START TRANSACTION en SQL Server gebruikt BEGIN TRANSACTION.

Buiten een expliciete transactie gebruiken de meeste databases autocommit, waarbij elke verklaring wordt opgeslagen zodra deze is voltooid. Oracle is een opmerkelijke uitzondering, omdat een sessie daar in een transactie blijft totdat u zich vastlegt.

COMMIT: maak het permanent

BEGIN;
UPDATE accounts SET balance = balance - 300 WHERE id = 1;
UPDATE accounts SET balance = balance + 300 WHERE id = 2;
COMMIT;

-- Asha | 700
-- Ben  | 500

Totdat COMMIT loopt, zijn de wijzigingen voorlopig. Zodra het succesvol terugkeert, garandeert de database dat ze worden opgeslagen. Het totaal voor beide rekeningen bleef op 1200, wat het hele punt van de oefening is.

ROLLBACK: annuleer alles

ROLLBACK maakt alles ongedaan sinds de transactie begon:

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
SELECT owner, balance FROM accounts;
-- Asha | 600   (visible inside this transaction)
-- Ben  | 500

ROLLBACK;
SELECT owner, balance FROM accounts;
-- Asha | 700   (back to where it was)
-- Ben  | 500

Een rollback gebeurt ook automatisch als de verbinding wegvalt of de server crasht voordat u een commit maakt, zodat een halfvoltooide transactie niet overleeft.

Wanneer een stelling mislukt

Hier is een realistischer geval. Asha probeert 5000 te sturen, wat niet op de rekening staat. Het krediet aan Ben loopt eerst, en daarna overtreedt het debet de CHECK regel:

BEGIN;
UPDATE accounts SET balance = balance + 5000 WHERE id = 2;
UPDATE accounts SET balance = balance - 5000 WHERE id = 1;
-- error: CHECK constraint failed: balance >= 0

ROLLBACK;

-- Asha | 700
-- Ben  | 500

Zonder de transactie zou Ben de 5000 hebben gehouden en zouden de boeken verkeerd zijn. Houd rekening met één belangrijk detail: een falende verklaring annuleert de transactie niet altijd vanzelf. In SQLite en MySQL kunnen eerdere instructies bijvoorbeeld in behandeling blijven, dus uw code moet de rollback uitvoeren. PostgreSQL markeert in plaats daarvan de hele transactie als afgebroken en weigert verdere instructies totdat u terugdraait.

Koppel in applicatiecode altijd de transactie aan foutafhandeling. Hier is het idee in Python, en onze gids voor Python-afhandeling van uitzonderingen legt de syntaxis uit:

try:
    conn.execute("BEGIN")
    conn.execute(debit_sql, values)
    conn.execute(credit_sql, values)
    conn.execute("COMMIT")
except Exception:
    conn.execute("ROLLBACK")
    raise

Spaar punten

Een savepoint markeert een positie binnen een transactie, zodat u slechts een deel van het werk ongedaan kunt maken:

BEGIN;
UPDATE accounts SET balance = balance - 50 WHERE id = 1;
SAVEPOINT bonus;
UPDATE accounts SET balance = balance + 999 WHERE id = 2;
ROLLBACK TO bonus;
UPDATE accounts SET balance = balance + 50 WHERE id = 2;
COMMIT;

-- Asha | 650
-- Ben  | 550

De bonus van 999 werd ongedaan gemaakt, terwijl de rest van de transactie werd voortgezet en vastgelegd. Dit is handig voor optionele stappen in een lang proces.

ZUUR-eigenschappen uitgelegd

Eigendom Beloof het Bij onze overdracht
Atomiciteit Alles of niets Beide updates gebeuren, of geen van beide
Consistentie Regels gelden daarna nog steeds Geen enkel evenwicht kan de CHECK regel breken
Isolatie Gelijktijdig werk interfereert niet Anderen zien geen half voltooide transfer
Duurzaamheid Toegewijde gegevens overleven mislukkingen Bij een stroomstoring na COMMIT gaat er niets verloren

Consistentie wordt vaak verkeerd begrepen. De database handhaaft alleen de regels die u declareert, zoals beperkingen en vreemde sleutels. Het zal niet voorkomen dat uw code het verkeerde bedrag overmaakt. Duurzaamheid wordt meestal bereikt met een vooruitschrijflogboek, waarin wijzigingen veilig op schijf worden vastgelegd voordat de commit wordt bevestigd.

Wat gebeurt er bij gelijktijdige transacties?

We hebben twee verbindingen met één SQLite-bestand geopend. De eerste startte een transactie en updatete een rij van 1 naar 2, zonder zich nog vast te leggen. Dit is wat de tweede verbinding zag:

Connection B reads:   1                     -- no uncommitted data
Connection B writes:  database is locked    -- it has to wait
(A commits)
Connection B reads:   2                     -- now it sees the change

SQLite staat slechts één schrijver tegelijk toe, wat eenvoudiger is dan serverdatabases, waar veel transacties tegelijkertijd verschillende rijen kunnen schrijven. Maar het principe is hetzelfde: andere sessies zouden onder normale instellingen geen niet-vastgelegde wijzigingen moeten zien, en conflicterende schrijfbewerkingen moeten wachten. In onze test hebben we de tweede verbinding ingesteld om onmiddellijk op te geven in plaats van te wachten, zodat de fout meteen verscheen.

Lees afwijkingen

Wanneer transacties elkaar overlappen, kunnen bepaalde problemen optreden. De SQL-standaard definieert deze in termen van wat een transactie kan waarnemen:

Anomalie Wat gebeurt er
Vies lezen U leest een wijziging die een andere transactie niet heeft vastgelegd en die later mogelijk wordt teruggedraaid
Niet-herhaalbaar lezen Je leest een rij twee keer in één transactie en krijgt verschillende waarden, omdat iemand daartussenin heeft gecommitteerd
Fantoom lezen U voert dezelfde query twee keer uit en krijgt extra of ontbrekende rijen, omdat iemand er enkele heeft ingevoegd of verwijderd

Een ander probleem is de verloren update. Twee sessies lezen een saldo van 100, elke voegt 10 toe en elke schrijft 110. Eén update is feitelijk verdwenen, terwijl het antwoord 120 zou moeten zijn.

SQL-isolatieniveaus

Met isolatieniveaus kunt u striktheid inruilen voor gelijktijdigheid. Dit is wat de SQL-standaard op elk niveau toestaat:

Niveau Vies lezen Niet-herhaalbaar lezen Fantoom lezen
Lees vrijblijvend Mogelijk Mogelijk Mogelijk
Lees toegewijd Voorkomen Mogelijk Mogelijk
Herhaalbaar lezen Voorkomen Voorkomen Mogelijk
Serialiseerbaar Voorkomen Voorkomen Voorkomen
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

De exacte syntaxis en het gedrag zijn afhankelijk van uw database. De standaardinstellingen verschillen ook: PostgreSQL en SQL Server gebruiken read commit, terwijl MySQL’s InnoDB herhaalbaar lezen gebruikt. Sommige databases geven sterkere garanties dan de standaard vereist, of behandelen het ene niveau als het andere. In PostgreSQL gedraagt ​​read uncommit zich bijvoorbeeld als read commit. Lees altijd de documentatie van uw database voordat u op een specifiek gedrag vertrouwt.

Tip: Als een update verloren is gegaan, brengt u de wijziging in één enkele instructie aan, zoals in UPDATE accounts SET balance = balance + 10. Door de berekening in uw toepassing uit te voeren op basis van een eerdere lezing, wordt de kloof geopend.

Impasses

Er is sprake van een deadlock wanneer twee transacties elk een lock bevatten die de ander nodig heeft. Transactie A vergrendelt rij 1 en wil rij 2, terwijl transactie B rij 2 vergrendelt en rij 1 wil. Geen van beide kan doorgaan.

Databases als PostgreSQL, MySQL en SQL Server merken dit op en annuleren één transactie met een foutmelding. Dat is normaal gedrag en uw aanvraag moet hierop voorbereid zijn. Om impasses te voorkomen, moet u de rijen altijd in een consistente volgorde bijwerken, bijvoorbeeld met de laagste account-ID eerst, de transacties kort houden en het opnieuw proberen wanneer iemand als slachtoffer is gekozen.

Beste praktijken

  • Houd transacties kort. Lange transacties houden sloten vast en blokkeren andere gebruikers.
  • Wacht nooit op een gebruiker of een trage API binnen een transactie. Doe dat werk voordat je begint, of daarna.
  • Handel altijd fouten af. Elk pad moet eindigen in een commit of een rollback.
  • Voeg beperkingen toe. Ze geven de database echte regels die kunnen worden afgedwongen. Een goed tafelontwerp helpt ook.
  • Gebruik goede indexen. Snellere zoekopdrachten betekenen dat vergrendelingen minder lang worden vastgehouden.
  • Wees voorzichtig met nieuwe pogingen. Probeer het opnieuw bij impasses, maar zorg ervoor dat een bewerking niet tweemaal kan worden toegepast.
  • Test gelijktijdigheid expres. Veel van deze bugs verschijnen alleen onder belasting, dus eenvoudige integratietests alleen brengen ze mogelijk niet aan het licht.

Tot slot

Transacties maken van meerdere risicovolle stappen één veilige operatie, en ACID beschrijft de garanties die dit betrouwbaar maken. Wanneer een zakelijke actie meer dan één rij of tabel raakt, vraag uzelf dan af wat er zou gebeuren als deze halverwege zou stoppen. Als het antwoord u zorgen baart, verpak het dan in een transactie. Om te oefenen opent u twee sessies in een lokale database en probeert u zelf de afwijkingen te produceren.

Veelgestelde vragen

Wat is een transactie in SQL?

Een transactie is een groep SQL-instructies die als één eenheid worden behandeld. Ofwel worden ze allemaal opgeslagen met COMMIT, ofwel worden ze allemaal ongedaan gemaakt met ROLLBACK.

Wat zijn ACID-eigenschappen in een database?

ACID staat voor atomiciteit, consistentie, isolatie en duurzaamheid. Samen zorgen ze ervoor dat transacties alles of niets zijn, houden ze de regels intact, bemoeien ze zich niet en overleven ze mislukkingen.

Wat is het verschil tussen COMMIT en ROLLBACK?

COMMIT slaat permanent alle wijzigingen op die in de transactie zijn aangebracht. ROLLBACK annuleert ze en retourneert de gegevens zoals ze waren voordat de transactie begon.

Wat is vies lezen?

Er is sprake van een dirty read als de ene transactie wijzigingen leest die een andere nog niet heeft vastgelegd. Als die andere transactie wordt teruggedraaid, hebben de gelezen gegevens nooit echt bestaan.

Welk isolatieniveau moet ik gebruiken?

Begin met de standaardwaarde van uw database, wat meestal prima is. Gebruik serialiseerbaar voor kritieke logica waarbij afwijkingen onaanvaardbaar zijn, en wees voorbereid om mislukte transacties opnieuw te proberen.

Blijf leren

Werk met Stack Quora

Hulp nodig met testen, WordPress of SEO?

We helpen teams betere software te leveren en hun sites te laten groeien. Vertel ons waar u mee bezig bent en wij stellen een duidelijke volgende stap voor.

Blijf lezen

Meer handleidingen over testen, AI en moderne ontwikkeling

Genoten van dit artikel? Kies een onderwerp en ga direct naar onze nieuwste tutorials.

Kunstmatige intelligentie

AI-hallucinaties uitgelegd: waarom taalmodellen dingen verzinnen en hoe ze te verminderen

AI-hallucinaties uitgelegd: wat ze zijn, waarom taalmodellen ze produceren, veelvoorkomende typen, hoe je ze kunt verminderen met aarding en aanwijz…

Lees artikel →
DevOps

Omgevingsvariabelen uitgelegd: .env-bestanden, geheimen en configuratie goed gedaan

Omgevingsvariabelen uitgelegd met Python-voorbeelden die we hebben uitgevoerd: ze lezen en instellen, waarom elke waarde een string is, .env-bestand…

Lees artikel →
Softwareontwikkeling

API-snelheidsbeperking uitgelegd: algoritmen, headers en afhandeling van 429-fouten

API-snelheidsbeperking uitgelegd met een simulatie die we hebben uitgevoerd: token-bucket, vast venster, schuifvenster, 429 reacties, headers van sn…

Lees artikel →
Testautomatisering

Spotten in Python: unittest.mock, patch en de fouten die tests doen liegen

Spotten in Python met unittest.mock, getest: Mock en return_value, side_effect, patchen waar een naam wordt gebruikt, spec en autospec, spotdatums e…

Lees artikel →
Softwaretesten

Codedekking uitgelegd: lijn versus filiaaldekking en wat 100% werkelijk betekent

Codedekking uitgelegd met een echte dekking.py-run: dekking van lijnen, vertakkingen en condities, een rapport lezen, waarom 100% dekking nog steeds…

Lees artikel →
Databases & SQL

DELETE versus TRUNCATE versus DROP in SQL: verschillen, terugdraaien en wanneer elk te gebruiken

DELETE versus TRUNCATE versus DROP uitgelegd met geteste SQL: wat elk verwijdert, terugdraaien, triggers, identiteitsreset, snelheid en hoe PostgreS…

Lees artikel →
Databases & SQL

SQL-weergaven uitgelegd: creëer, gebruik en vermijd de valkuilen, met voorbeelden

SQL-weergaven uitgelegd met query's die we hebben uitgevoerd: een weergave maken, live resultaten, kolommen verbergen, prestaties, bijwerkbare en ge…

Lees artikel →
Softwareontwikkeling

TypeScript-interface versus type: echte verschillen, getest met de compiler

TypeScript-interface versus type, gecontroleerd met de echte compiler: wat beide kunnen doen, wat slechts één kan doen, samenvoegen van declaraties,…

Lees artikel →
Softwareontwikkeling

Python *args en **kwargs uitgelegd: flexibele functies met duidelijke voorbeelden

Python *args en **kwargs uitgelegd met code die we hebben uitgevoerd: in- en uitpakken, parametervolgorde, argumenten die alleen trefwoorden en posi…

Lees artikel →
Softwareontwikkeling

Python Lambda-functies: syntaxis, echt gebruik en wanneer u ze niet moet gebruiken

Python lambda-functies uitgelegd met code die we hebben uitgevoerd: syntaxis, sorteren met sleutel, kaart en filter, sluitingen, de laat-bindende va…

Lees artikel →
Kunstmatige intelligentie

Wat zijn AI-agenten? Hoe ze werken, met een eenvoudige agentloop die u kunt uitvoeren

Wat zijn AI-agenten? Een duidelijke gids voor de agentenlus, tools, geheugen en vangrails, met een kleine Python-lus die we hebben uitgevoerd, echte…

Lees artikel →
DevOps

Monitoring versus waarneembaarheid: het echte verschil, met logboeken, statistieken en sporen

Monitoring versus waarneembaarheid uitgelegd: bekende en onbekende fouten, logboeken, statistieken en sporen, een walkthrough voor afrekenincidenten…

Lees artikel →
DevOps

Docker-volumes versus bindingsmounts: bewaar containergegevens op de juiste manier

Docker-volumes versus bind-mounts uitgelegd: waarom containergegevens verdwijnen, benoemde volumes, bind-mounts, tmpfs, Compose-voorbeelden, back-up…

Lees artikel →
Testautomatisering

TDD versus BDD: belangrijkste verschillen, één functie die op beide manieren is gebouwd en wanneer deze moet worden gebruikt

TDD versus BDD uitgelegd met één kortingsfunctie die in beide richtingen is gebouwd: rood-groen-refactor met code die we hebben uitgevoerd, gegeven-…

Lees artikel →
Softwaretesten

Gebruikersacceptatietesten (UAT): proces, checklist en echte voorbeelden

Gebruikersacceptatietesten uitgelegd: wie voert het uit, hoe het verschilt van QA, een proces in zeven stappen, een UAT-testcase-sjabloon, een check…

Lees artikel →
Databases & SQL

SQL NULL-waarden uitgelegd: IS NULL, COALESCE, NULLIF en de te vermijden vallen

SQL NULL-waarden uitgelegd met query's die we hebben uitgevoerd: logica met drie waarden, IS NULL, COALESCE, NULLIF, hoe aggregaten, joins en sorter…

Lees artikel →
Databases & SQL

SQL CASE WHEN-instructie: syntaxis, echte voorbeelden en veelvoorkomende fouten

SQL CASE WHEN uitgelegd met vragen die we hebben uitgevoerd: eenvoudige en doorzochte formulieren, volgorde van de voorwaarden, draaipunten met SUM,…

Lees artikel →
Softwareontwikkeling

Wat is JWT? JSON-webtokens uitgelegd met een werkend voorbeeld

Wat is JWT? JSON Web Tokens uitgelegd: de drie delen, een token gebouwd en waarmee is geknoeid in de code die we hebben uitgevoerd, JWT versus sessi…

Lees artikel →
Softwareontwikkeling

JavaScript-gebeurtenislus uitgelegd: call-stack, microtaken en timers met voorbeelden

De JavaScript-gebeurtenislus uitgelegd met code die we hebben uitgevoerd: call-stack, taak- en microtask-wachtrijen, waarom setTimeout 0 niet onmidd…

Lees artikel →
Softwareontwikkeling

Python-generatoren en opbrengst uitgelegd: bespaar geheugen met echte voorbeelden

Python-generatoren en opbrengst uitgelegd met code die we hebben uitgevoerd: hoe ze pauzeren en hervatten, gemeten geheugenbesparingen, pijplijnen, …

Lees artikel →
Kunstmatige intelligentie

Wat zijn inbeddingen? Vectoren en cosinusovereenkomst eenvoudig uitgelegd

Wat zijn insluitingen? Een gids in duidelijke taal over vectoren, cosinusovereenkomst en semantisch zoeken, met een klein voorbeeld dat we hebben ui…

Lees artikel →
DevOps

Implementatie van blauwgroen versus kanarie: verschillen, afwegingen en hoe te kiezen

Blauw-groen versus kanarie-implementatie uitgelegd: hoe elk werkt, kosten, risico's en terugdraaien, stabiele gebruikersbucket die we hebben getest,…

Lees artikel →
Testautomatisering

Schilferige tests: wat de oorzaak ervan is en hoe u ze voorgoed kunt oplossen

Zwakke tests uitgelegd met demo's die we hebben uitgevoerd: de belangrijkste oorzaken, hoe je er een kunt bevestigen en diagnosticeren, goede oploss…

Lees artikel →
Softwaretesten

Belastingtesten versus stresstesten: verschillen, statistieken en k6-voorbeelden

Belastingtesten versus stresstesten uitgelegd: wat elk bewijst, piek- en soak-tests, de statistieken die er toe doen, waarom gemiddelden misleiden, …

Lees artikel →
Softwaretesten

Testcase versus testscenario: belangrijkste verschillen, voorbeelden en wanneer deze te gebruiken

Testcase versus testscenario uitgelegd: duidelijke definities, een tabel naast elkaar, één functie voor het opnieuw instellen van wachtwoorden, over…

Lees artikel →
Databases & SQL

Optimalisatie van SQL-query's: lees uitvoeringsplannen en repareer langzame query's, met timing

Optimalisatie van SQL-query's getest op een miljoen rijen: lees uitvoeringsplannen, voeg de juiste indexen toe, repareer niet-sargeerbare filters, g…

Lees artikel →
Databases & SQL

SQL UNION versus UNION ALL: verschillen, voorbeelden en geteste prestaties

SQL UNION versus UNION ALL uitgelegd met de query's die we hebben uitgevoerd: duplicaten, de regels volgen beide, een echte databug, gemeten prestat…

Lees artikel →
Softwareontwikkeling

JavaScript Fetch API-tutorial: GET, POST, foutafhandeling en time-outs

Een JavaScript Fetch API-tutorial getest tegen een lokale server: GET en POST, waarom 404 niet gooit, een herbruikbare helper, queryreeksen, time-ou…

Lees artikel →
Softwareontwikkeling

Python-bestandsverwerking: lezen, schrijven, CSV, JSON en pathlib met voorbeelden

Het verwerken van Python-bestanden uitgelegd met code die we hebben uitgevoerd: open modi, met het lezen van grote bestanden, CSV, JSON, pathlib, bi…

Lees artikel →
Softwareontwikkeling

Python-klassen en -objecten: OOP-zelfstudie met echte voorbeelden

Python-klassen en -objecten uitgelegd met code die we hebben uitgevoerd: __init__, methoden, klasse versus instantie-attributen, overerving, eigensc…

Lees artikel →
Kunstmatige intelligentie

Wat is een groot taalmodel? Hoe LLM's werken, uitgelegd zonder de hype

Wat is een groot taalmodel? LLM's uitgelegd in duidelijke taal: tokens, inbedding, aandacht, training, temperatuur- en contextvensters, een kleine d…

Lees artikel →
DevOps

Linux-opdrachten voor beginners: de essentiële terminalgids met voorbeelden

Linux-opdrachten voor beginners, gegroepeerd op taak: navigatie, bestanden, logboeken bekijken, grep, pipelines, machtigingen, processen en archieve…

Lees artikel →
Testautomatisering

Selenium versus toneelschrijver: belangrijkste verschillen, code vergeleken en welke te kiezen

Selenium versus Playwright vergeleken: architectuur, wachten, browser- en taalondersteuning, debuggen, dezelfde test in beide tools, migratieadvies …

Lees artikel →
Softwaretesten

Equivalentiepartitionering: testontwerptechniek uitgelegd met uitgewerkte voorbeelden

Equivalentiepartitionering uitgelegd: hoe je geldige en ongeldige partities kunt vinden, uitgewerkte voorbeelden voor leeftijden, wachtwoorden en ko…

Lees artikel →
Softwaretesten

Ernst versus prioriteit bij het testen van software: verschillen, matrix en echte voorbeelden

Ernst versus prioriteit bij het testen van software uitgelegd: duidelijke definities, een vierwegmatrix met voorbeelden, niveauschalen, wie deze bep…

Lees artikel →
Databases & SQL

Tutorial voor SQL-subquery's: typen, gecorreleerde subquery's en BESTAAN met voorbeelden

Een SQL-subquery-tutorial met query's die we hebben uitgevoerd: scalaire, IN-, FROM- en SELECT-subquery's, gecorreleerde subquery's, EXISTS, de NOT …

Lees artikel →
Databases & SQL

SQL-transacties en ACID uitgelegd: COMMIT-, ROLLBACK- en isolatieniveaus

SQL-transacties en ACID uitgelegd met een bankoverschrijving die we hebben uitgevoerd: COMMIT, ROLLBACK, savepoints, locks, isolatieniveaus, dirty r…

Lees artikel →
Softwareontwikkeling

Git merge vs rebase: verschillen, voorbeelden en wanneer je wat gebruikt

Git merge vs rebase uitgelegd met echte logoutput, een vergelijkingstabel, de gouden regel van rebase en een veilige teamwerkwijze.

Lees artikel →
Softwareontwikkeling

Python list comprehension: syntaxis, voorbeelden en wanneer je het vermijdt

Python list comprehension uitgelegd: syntaxis, filteren, if-else, geneste lussen, gemeten tijden en wanneer een gewone for-lus beter is.

Lees artikel →
Databases & SQL

SQL JOIN uitgelegd met voorbeelden (Inner, Left, Right, Full)

Begrijp SQL joins stap voor stap met voorbeeldtabellen en queries: INNER, LEFT, RIGHT, FULL, CROSS en SELF, plus veelgemaakte fouten en prestatietips.

Lees artikel →