Hvis en transaktion kun omfatter læsning, vil den altid kunne startes forfra. Resten af afsnittet handler om transaktioner, der omfatter skrivning til databasen. Der findes flere måder at implementere atomare transaktioner på, men det almindeligste er at bruge en "skriv-foran-log" (write ahead log). Denne log vil i det følgende blive omtalt som en transaktionslog. Først skrives en beskrivelse af ændringen i transaktionsloggen og derefter gennemføres ændringen i selve databasen. Når en transaktion er gennemført, markeres den som gennemført i loggen.
Fejl håndteres forskelligt alt efter om det er fejl, der opdages af databasesystemet eller det er fejl, der opdages af det opdaterende program. Hvis fejl opdages af programmet, markeres transaktionen som fejlbehæftet, og alle opdateringer føres tilbage til udgangspunktet ved hjælp af oplysningerne i transaktionsloggen. Selvom databaseprogrammet finder en fejl, skal transaktionen så vidt muligt gennemføres. Hvis det er lykkedes at skrive transaktionen i loggen, gennemføres den fra oplysningerne her, ellers ikke. I visse tilfælde kan hensynet til korrekt isolation gøre, at en transaktion ikke kan gennemføres. I disse tilfælde bliver ændringerne ført tilbage, og det opdaterende program må forsøge at gennemføre transaktionen på ny.
I en relationel database kan man oprette tabellerler. Tabeller består af rækkerr af felterer. Et bestemt felt på tværs af rækkerne kaldes en kolonne. Relationerne mellem tabellerne udgør den enkelte databases struktur.
Det teoretiske grundlag for den relationelle datamodel er mængdelæren. I praksis er det dog de færeste systemer, der lever helt op til reglerne om mængder. For eksempel er det ofne muligt, at have resultater af forespørgsler, der indeholder dubletter af rækker.
Data i en relationel database skal som minimum overholde følgende:
- Hver række i en tabel skal have en unik nøgle
- Alle rækker har det samme antal kolonner
- Alle felter har en fast længde. Selv såkaldte variable tekstfelter har en maksimal længde.
Ved læsning af data bruges tre grundlæggende operationer.
- Selektion: Find rækker, der opfylder en bestemt betingelse som for eksempel "alder = 42"
- Projektion: Vælg et antal kolonner fra en tabel. Det kunne være fornavn og efternavn.
- Krydsprodukt: Kombiner alle rækker i en tabel med alle rækker i en anden tabel.
Operationerne kan kombineres, så man kan lave forespørgsler i stil med "Kombiner persontabellen og og adressetabellen. Find fornavn, efternavn og adresse på dem, der er 42 år gamle".
Med det meget udbredte forespørgselssprog SQL kunne det se sådan ud:
SELECT fornavn, efternavn, gade, husnr, postnr
FROM persontb, adressetb
WHERE persontb.adresseID = adressetb.adresseID
AND persontb.alder = 42