Databaserij Locking bepaalt in MySQL precies welke transactie welke rijen wanneer mag lezen of schrijven, en biedt zo bescherming tegen verloren updates en ‘dirty reads’. Ik laat stap voor stap zien hoe vergrendelingen, MVCC en hoe isolatieniveaus op elkaar inwerken, waar er problemen met gelijktijdigheid ontstaan en hoe ik query’s, indexen en transacties zo kan opzetten dat blokkades worden voorkomen.
Centrale punten
Om je snel een idee te geven van waar ik me in dit artikel op richt, zet ik de belangrijkste richtlijnen op een rijtje en zet ik ze kort naast elkaar. Zo krijg je een overzichtelijk kader voor de volgende, meer diepgaande Toelichtingen.
- Rijsloten Beperk conflicten tot afzonderlijke rijen in plaats van hele tabellen.
- MVCC maakt snel lezen mogelijk zonder permanente gedeelde vergrendelingen.
- Isolatie bepaalt welke afwijkingen zijn toegestaan.
- Gap/Volgende-toets indexgaten tegen fantomen afsluiten.
- Beste praktijken verminderen blokkeringen en deadlocks aanzienlijk.
Vervolgens zet ik deze punten om in concrete maatregelen waarmee ik productieve MySQL-instanties veiliger en sneller houd. Elke aanbeveling is erop gericht om minder Blokkeren, consistente gegevens en duidelijke diagnostische trajecten.
Waarom controle op gelijktijdigheid noodzakelijk is
Gelijktijdige toegangen botsen op elkaar zodra meerdere sessies dezelfde regels willen lezen of schrijven, en daarom kies ik voor duidelijke Transactielimieten Acht. Zonder regels dreigen er verloren updates, dirty reads, non-repeatable reads en phantoms, die uiteindelijk tot verkeerde beslissingen in de applicatiecode leiden. Ik voorkom dit door leesconsistentie te waarborgen en schrijfconflicten vroegtijdig zichtbaar te maken, in plaats van ze stilzwijgend te overschrijven. Hoe meer parallelle gebruikers actief zijn, hoe belangrijker kleine lock-objecten en korte Wachtijden. Wie dit negeert, riskeert gegevensfouten, lange wachtrijen en time-outs.
De basisprincipes van rijvergrendeling in MySQL
Row Locking zet vergrendelingen op afzonderlijke rijen, zodat andere rijen vrij blijven en meer Parallellisme ontstaat. Een exclusieve lock beschermt schrijfbewerkingen tot aan de commit, terwijl leesbewerkingen, afhankelijk van het isolatieniveau, gebruikmaken van gedeelde locks of MVCC-snapshots. Intent-locks dienen als signalen op een hoger niveau, zodat de engine de lock-compatibiliteit sneller kan controleren. Ik merk altijd op dat zelfs kleine updates veel regels kunnen beïnvloeden als WHERE-voorwaarden onnauwkeurig zijn en er geen Index leidt tot. Nauwkeurigheid in het filter voorkomt brede uitsluitingsgebieden en ontziet de concurrency.
Ook de interactie met de indexen is belangrijk, want InnoDB vergrendelt via indexpaden; ontbrekende of ongeschikte sleutels vergroten het aantal betrokken rijen aanzienlijk. Als een statement een volledige scan uitvoert, wordt het lock-veld groter, wat wachttijden verlengt en deadlocks in de hand werkt. Daarom plan ik vanaf het begin de juiste sleutels voor veelvoorkomende paden en houd ik de WHERE-clausules zo specifiek mogelijk. Zo blijven mijn vergrendelingen beperkt en komen andere transacties sneller aan de Toegang. Dat is de eenvoudigste manier om het vergrendelingsmechanisme soepel te laten werken.
Pessimistische versus optimistische locking
Bij pessimistisch locking wordt uitgegaan van conflicten en wordt er al vroeg geblokkeerd, wat de integriteit versterkt, maar tijd kost, terwijl optimistisch Systemen controleren pas aan het einde of er gegevens zijn gewijzigd. In praktijkgerichte MySQL-configuraties combineer ik beide: voor kritieke accounts boek ik met FOR UPDATE, voor entiteiten die zelden conflicteren gebruik ik versies. Een versiekolom of een tijdstempel stelt me in staat om bij de update vast te stellen of iemand sneller was, zonder de rij permanent te blokkeren. Als er een conflict optreedt, herhaal ik de transactie gericht of voer ik aangepaste bedrijfslogica uit. Zo verdeel ik de belasting netter, verminder ik wachttijden en houd ik de Correctheid hoog.
Ik kies de strategie per use case: bij veel gelijktijdige leestoegangen werken optimistische benaderingen goed, terwijl voor zeer kritieke financiële of voorraadboekingen korte, maar duidelijke exclusieve vergrendelingen de beste keuze zijn. Het doel blijft altijd om slechts zoveel als nodig te blokkeren en conflicten vroegtijdig te herkennen. Met deze aanpak vermijd ik langgerekte ketens van wachtende sessies. Hierdoor stijgt de doorvoer en Betrouwbaarheid in het dagelijks leven.
Inzicht in isolatieniveaus en MVCC
De isolatiegraad bepaalt hoeveel afwijkingen ik toestaat en hoe streng MySQL vergrendelt; daarom kies ik het niveau bewust op basis van de use case. READ COMMITTED voorkomt 'dirty reads', REPEATABLE READ houdt de waarden van een transactie consistent en SERIALIZABLE zorgt voor de strengste volgorde. InnoDB maakt gebruik van MVCC, zodat lezers bijna altijd zonder shared locks kunnen werken en toch consistente snapshots te zien krijgen. Wie hiermee werkt, moet begrijpen wanneer gap- en next-key-locks extra in werking treden om phantoms te voorkomen. Voor meer achtergrondinformatie is het de moeite waard om eens te kijken naar Details over isolatieniveaus, zodat je de effecten per niveau goed kunt inschatten.
In de volgende tabel worden gangbare beveiligingsniveaus gerangschikt op basis van typische afwijkingen en de invloed op blokkeringen, zodat ik de juiste keuze kan maken en onnodige Blokkeren vermijden.
| Isolatieniveau | Toegestane afwijkingen | Lock-gedrag (vereenvoudigd) | Typisch gebruik |
|---|---|---|---|
| NIET-VASTGELEGD LEZEN | Dirty Reads, Non-Repeatable, Phantoms | Nauwelijks beperkingen, hoge Risico's | Zelden zinvol |
| READ COMMITTED | Niet-herhaalbaar, fantoomwaarden | Lezers gebruiken MVCC, schrijvers X-Locks | Rapporten, API's met veel leesverzoeken |
| HERHAALBAAR LEZEN | Phantoms in de aanbieding bij Next-Key | Sterke consistentie bij het lezen, gericht Gap-Vergrendelen | Standaard in InnoDB |
| SERIALISABLE | Geen afwijkingen | Breder, lager Parallellisme | Zeer kritieke processen |
Ik begin meestal met REPEATABLE READ en pas dit gericht aan als query’s te veel vertraging oplopen door Next-Key-locks. Omgekeerd gebruik ik SERIALIZABLE alleen wanneer dat vanuit functioneel oogpunt onvermijdelijk is, omdat de wachttijden anders oplopen. Door een duidelijke keuze per workload houd ik gegevens consistent en bescherm ik tegelijkertijd de Prestaties. Deze aanpak bespaart supporttijd, omdat er minder vaak onverwachte pieken in het aantal vergrendelingen optreden. Zo blijft het systeem voorspelbaar, ook als het aantal gebruikers toeneemt.
MySQL-concurrency in de praktijk
Goede concurrency begint bij duidelijk geformuleerde query’s die alleen de werkelijk benodigde rijen opleveren, zodat InnoDB kleine Rij-vergrendelingen kan instellen. Ik zorg ervoor dat filtervoorwaarden sargable zijn, dat wil zeggen dat ze via indexen lopen en geen functieaanroepen op kolommen vereisen. Updates houd ik gericht: duidelijke WHERE-clausule, geschikte index, geen onnodige joins in dezelfde instructie. Voor reserveringen gebruik ik FOR UPDATE spaarzaam en alleen voor de daadwerkelijk betrokken records. Bovendien vermijd ik lange gebruikersinteracties tussen BEGIN en COMMIT, want elke seconde verhoogt de wachttijd andere sessies.
Bij invoegingen in drukke indexruimtes houd ik er rekening mee dat er Next-Key-locks kunnen optreden, waardoor meer transacties in de wachtrij terechtkomen. Ik spreid hotspots door sleutelruimten te verspreiden of het schrijfpad te ontlasten in een kleine, afzonderlijke wachtrij. Zo verminder ik de botsingen op de drukste tabel. Deze verfijning heeft een groter effect dan het verhogen van time-outs, omdat er minder Conflicten over het algemeen ontstaan. Juist daarom is het de moeite waard om het dataverkeer vóór de livegang te meten.
Typische problemen met gelijktijdigheid: blokkering, deadlocks, omvang van vergrendelingen
Er ontstaat een blokkering wanneer een transactie wacht op een regel die al is vergrendeld; daarom houd ik transacties kort en de betreffende Aantal beperk. Deadlocks treden op wanneer twee transacties elkaar blokkeren; MySQL herkent dit en breekt een van beide af. Ik reageer hierop met gerichte herhalingspogingen en een consistente toegangsvolgorde in alle codepaden. Lock-escalatie komt in InnoDB minder vaak voor, maar interne limieten beperken de beheersinspanning; grote scans brengen de engine dichter bij dergelijke grenzen. Wie herhaaldelijk deadlocks ziet, moet de Detectie en afhandeling van deadlocks systematisch controleren en de bronnen van conflicten wegnemen, in plaats van alleen de time-outs te verlengen.
Mijn ervaring leert dat er drie patronen zijn die voor bijzonder veel wachttijd zorgen: niet-geïndexeerde filters op veelgebruikte tabellen, FOR UPDATE zonder exacte WHERE-clausule en uitgebreide bedrijfslogica tussen de lees- en schrijfstap. Ik los dit op door elk pad afzonderlijk te meten, de vergrendelingsduur te verkorten en de SQL-statements af te stemmen op indexpaden. Kleine aanpassingen aan het filter of aan de volgorde van de updates lossen vaak hele knelpunten op. Dergelijke correcties zijn goedkoper dan meer Hardware, omdat ze een blijvend effect hebben. Pas daarna is het de moeite waard om na te denken over verticale of horizontale schaalvergroting.
Beste praktijken tegen blokkeringen en deadlocks
Ik rond transacties snel af en laat geen invoerformulieren openstaan terwijl er locks worden vastgehouden, omdat elke seconde onnodige Wachtrijen Ik zorg ervoor dat tabellen en rijen altijd in dezelfde volgorde worden verwerkt om cyclische afhankelijkheden te voorkomen. Voor louter leesbewerkingen volstaat READ COMMITTED vaak, terwijl ik bij kritieke updates REPEATABLE READ of tijdelijk FOR UPDATE gebruik. Indexontwerp blijft een must: zonder de juiste sleutel blokkeert een statement al snel veel te veel rijen. Foutafhandeling hoort er ook bij: ik vang deadlock-fouten op, log alle details en probeer een korte, nette Opnieuw proberen.
Monitoring maakt het pakket compleet: ik houd wachttijden, deadlock-aantallen en queryplannen in de gaten en optimaliseer eerst de opvallende pieken. Kleine verbeteringen in hotpaths leveren enorm veel op, omdat ze effect hebben op elke query. Zo zorg ik voor minder blokkades, meer doorvoer en betrouwbare responstijden. Deze aanpak werkt in de dagelijkse praktijk veel beter dan grootschalige herontwerpen. Strakke routines zijn beter dan algemene Acties bijna altijd.
MySQL-specifieke tips voor een hogere gelijktijdigheid
Ik maak bewust gebruik van autocommit: afzonderlijke statements hebben hier baat bij, terwijl samenhangende wijzigingen in een korte, duidelijke Transactie landt. SELECT … FOR UPDATE gebruik ik spaarzaam en alleen voor records die ik echt moet reserveren. Lange rapporten verplaats ik naar replica’s of analytische systemen, zodat OLTP-workloads niet hoeven te wachten. Daarnaast controleer ik regelmatig welke statements ongewoon veel locks vasthouden en waarom. Wie zich hier verder in wil verdiepen, moet de Opslagengine InnoDB en indexlay-outs zorgvuldig beoordelen in de context van het eigen schema, voordat de volgende release live gaat.
Ik minimaliseer hotspots door de primaire sleutels zo te kiezen dat de schrijfbelasting niet voortdurend aan het einde van een monotoon groeiende index samenkomt. Ook splits ik batchbewerkingen op in kleine stukjes om geen lange exclusieve vergrendelingen te veroorzaken. Met deze aanpak blijven vergrendelingen korter en neemt de contention meetbaar af. Hierdoor daalt het foutenpercentage en reageert de applicatie soepeler. Zo creëer ik reserves zonder meteen nieuwe Server opbouwen.
Monitoring en analyse: wat ik meet
Ik begin met statistieken over lock-wachttijden, het aantal deadlocks, lange transacties en de belangrijkste statements op basis van looptijd, zodat ik de grootste Hendel herken. Het Performance Schema, SHOW ENGINE INNODB STATUS en de logbestanden met trage query’s geven me concrete aanwijzingen. Daarna bekijk ik de uitvoeringsplannen van de slechtste query's en controleer ik of er indexen ontbreken of dat filters niet op de index kunnen worden gefilterd. Zodra ik knelpunten heb verholpen, observeer ik het effect gedurende meerdere piekperiodes. Deze cyclus van meten, aanpassen en verifiëren zorgt ervoor dat de kwaliteit de concurrentie merkbaar toeneemt.
Voor betrouwbare conclusies heb ik realistische testgegevens en echte toegangsmodellen nodig, niet alleen synthetische single-shot-tests. Belastingsprofielen met gelijktijdige sessies laten zien hoe locks echt werken. Dergelijke tests brengen verborgen hotspots aan het licht die in de dagelijkse praktijk anders pas laat opvallen. Wie releases op deze manier test, voorkomt verrassingen in de live-omgeving. Dat bespaart op de lange termijn kosten, tijd en zenuwen. Bekijk.
Hostingomgeving en databaseprestaties
Goede concurrency is afhankelijk van snelle hardware, want elke IO-vertraging verlengt de Sluitsnelheid. Ik let op snelle SSD’s, voldoende RAM voor bufferpools en korte verbindingswegen tussen de app en de database. CPU-reserves helpen om parallelle query’s zonder opstoppingen uit te voeren. Ik verminder netwerkvertragingen consequent, zodat roundtrips de effectieve blokkeringstijd niet opdrijven. Wie deze randvoorwaarden in het oog houdt, krijgt responsieve Diensten en minder miskramen.
Ook doordachte schaalbaarheidstrajecten zijn belangrijk: read-replica’s voor rapportages, sharding voor zeer grote datasets en afzonderlijke systemen voor analyse-workloads. Ik kies pas na metingen welke optie de moeite waard is en vermijd overhaaste beslissingen. Architectuur en SQL-discipline vullen elkaar aan; zonder goed opgestelde query's biedt hardware slechts een kortstondige oplossing. Met een goede mix verminder ik lock-conflicten aanzienlijk. Het resultaat is een betrouwbare gebruikerservaring zonder opvallende Wachttijden.
Lock-types in InnoDB in detail
Om weloverwogen beslissingen te nemen over querypaden, ben ik goed op de hoogte van de belangrijkste soorten locks: record-locks vergrendelen afzonderlijke indexvermeldingen, gap-locks vergrendelen de ruimte tussen twee indexvermeldingen, en next-key-locks zijn een combinatie van beide. Deze laatste voorkomen phantoms bij range-scans. Insert-Intention-Locks geven aan dat er iets ingevoegd gaat worden en maken het mogelijk om tegelijkertijd dingen in verschillende openingen in te voegen, zonder elkaar onnodig in de weg te zitten. Bij eenduidige zoekopdrachten via een unieke index beperkt InnoDB de vergrendeling tot een record-lock, wat blokkades minimaliseert. Zodra er een range-predikaat in het spel komt (BETWEEN, >, LIKE met voorvoegsel), treedt vaak een next-key-lock in werking en daarmee een breder vergrendelingsgebied.
Daarom ontwerp ik query’s zo dat ze zoveel mogelijk op unieke of zeer selectieve indexen terechtkomen. Niet alleen WHERE is bepalend: ook ORDER BY, LIMIT en de volgorde van JOIN’s beïnvloeden het gekozen indexpad – en daarmee de omvang van de vergrendelingen. Een gerichte herschrijving die gebruikmaakt van een ORDER BY met een passende index kan Next-Key-locks voorkomen en de wachttijden aanzienlijk verkorten.
Locking-reads doelgericht inzetten
Locking-reads zijn handig als ik rijen moet reserveren of concurrerende updates moet coördineren. In MySQL gebruik ik:
- SELECT … FOR UPDATE: exclusieve vergrendeling op gelezen rijen, geschikt voor reserveringen voorafgaand aan een update.
- SELECT … FOR SHARE (of LOCK IN SHARE MODE in oudere versies): gedeelde vergrendeling om consistente, alleen-lezen-bewerkingen te garanderen.
- NOWAIT en SKIP LOCKED: voorkom lange wachttijden – NOWAIT stopt onmiddellijk, SKIP LOCKED slaat geblokkeerde regels over.
Een veelgebruikt patroon voor takenwachtrijen:
START TRANSACTION;
SELECT id, payload
FROM jobs
WHERE status = 'ready'
ORDER BY priority, id
LIMIT 50
FOR UPDATE SKIP LOCKED;
-- markeer als 'processing' en commit
UPDATE jobs SET status = 'processing' WHERE id IN (...);
COMMIT; Zo verwerk ik taken parallel zonder dat ze elkaar blokkeren. Belangrijk blijft: nauwkeurige WHERE-clausules, een geschikte index op (status, priority, id) en korte transacties.
Metadata Locks (MDL) begrijpen
Naast rijvergrendelingen bestaan er metadatavergrendelingen die DDL en DML coördineren. Elke lopende query houdt een MDL-leesvergrendeling op de betreffende tabellen vast; DDL vereist exclusieve MDL-vergrendelingen. Een ondoordacht gestarte ALTER TABLE kan daarom wachten tot lange transacties of rapporten zijn voltooid – omgekeerd blokkeert een DDL op zijn beurt weer nieuwe DML-toegangen. Ik plan schemawijzigingen daarom buiten de piekuren, verkort de transactieduur en controleer vóór implementaties of sessies tabellen minutenlang openhouden. Online DDL-varianten verlichten veel problemen, maar vervangen geen discipline bij transactietijden. Bij de monitoring let ik specifiek op MDL-waits, omdat deze vermijdbare opstoppingen signaleren.
Vreemde sleutels, cascades en indexverplichting
Foreign keys verbeteren de gegevenskwaliteit, maar vergroten de lock-footprint. InnoDB controleert de consistentie via indexen – als deze ontbreken op de foreign key-kolommen, dreigen er uitgebreide scans en langdurige vergrendelingen. Daarom zorg ik voor indexen op elke verwijzende kolom. Cascading updates/deletes kunnen meerdere tabellen in één transactie vergrendelen en zo deadlocks bevorderen. Ik definieer een vaste toegangsvolgorde voor alle betrokken tabellen en houd wijzigingen klein. Waar cascades in de praktijk zeldzaam zijn, onderzoek ik alternatieven: expliciete, korte stappen met duidelijke WHERE-voorwaarden, om de vergrendelingsduur voorspelbaar te houden.
Auto-increment, hotspots en bulk-invoegingen
Primair sleutels die monotoon toenemen, veroorzaken aan het einde van de geclusterde index een hotspot. Veel parallelle invoegingen komen daar samen, wat de wachttijden verlengt. Ik spreid sleutels (bijvoorbeeld door middel van partitiesleutels of voorafgaande entiteits-ID's) of gebruik korte batchgroottes die netjes worden vastgelegd. Ik regel het auto-increment-gedrag via de lock-mode: voor OLTP geef ik de voorkeur aan instellingen die parallelle inserts toestaan en slechts kort blokkeren. Bij grote batches controleer ik of een COPY-achtig pad of kleine, herhaalbare subsets sneller zijn. Belangrijk blijft: maak indexen pas aan na grote laadprocessen of ontlast secundaire indexen tijdens het laden om invoeghotspots te verminderen.
Replicatie en consistente leesbewerkingen
Bij het lezen van replica’s houd ik rekening met vertragingen: anders kan een rapport verouderde gegevens weergeven. Voor consistente snapshots start ik transacties bewust met WITH CONSISTENT SNAPSHOT en stel ik READ ONLY in als er alleen wordt gelezen. Zo behoud ik een stabiel overzicht over meerdere statements – zonder onnodige blokkades. Tegelijkertijd zorg ik ervoor dat de applicatie bij replicatievertragingen tolerante paden heeft of indien nodig uitwijkt naar de primaire server, wanneer absolute actualiteit cruciaal is. Dit vermindert verrassingen en verklaart schijnbare „anomalieën“, die in werkelijkheid slechts replicatielatenties zijn.
Configuratie en herhalingsstrategieën
Ik pas lock-wachttijden en detectie op een zinvolle manier aan: een redelijke innodb_lock_wait_timeout voorkomt dat sessies minutenlang vastlopen. Ik herken deadlocks proactief en maak een duidelijk onderscheid: fout 1213 (deadlock) haal ik kort op met backoff en jitter; fout 1205 (lock wait timeout) beschouw ik als een signaal om het querypad te optimaliseren. innodb_deadlock_detect helpt bij veel korte transacties; bij extreem hoge parallelliteit kan de kosten-batenverhouding doorslaan – dan is het ontlasten van de hotspots bijna altijd de betere oplossing dan alleen maar aan de parameters draaien.
Herhalingen zijn alleen veilig als bewerkingen idempotent zijn. Ik ontwerp updatepaden zo dat een herhalingspoging dezelfde eindtoestand bereikt (bijvoorbeeld met versiekolommen, deterministische sets in plaats van incrementen of duidelijke zakelijke gebeurtenissen). Zo voorkom ik dubbele boekingen en houd ik de code robuust tegen onvermijdelijke conflicten.
Voorbeelden: batches zonder brede blokkades
Grote wijzigingen verdeel ik op basis van de primaire sleutel in kleine, geïndexeerde stukjes:
-- Voorbeeld: in batches verwijderen
SET @last_id = 0;
WHILE 1 DO
DELETE FROM events
WHERE id > @last_id
ORDER BY id
LIMIT 1000;
SET @rows = ROW_COUNT();
IF @rows = 0 THEN LEAVE; END IF;
SET @last_id = (SELECT MAX(id) FROM events WHERE id <= @last_id + 1000);
END WHILE; Dit patroon houdt transacties kort, verkort de duur van locks en geeft andere workloads de ruimte. Bij bulkupdates ga ik op dezelfde manier te werk: ik selecteer eerst de doel-ID’s in een tijdelijke set (of via een LIMIT-venster), schrijf vervolgens gericht en commit snel.
Handleiding voor snelle diagnose
Als de wachttijden oplopen, werk ik in een vaste volgorde:
- Het probleem afbakenen: welke tabellen, welke query's, op welk tijdstip?
- Wachtrijen zichtbaar maken: in Performance Schema de data_locks/data_lock_waits en blokkerende PID’s vaststellen; daarnaast de huidige InnoDB-status controleren.
- Queryplan controleren: maakt de query gebruik van de verwachte index? Zijn de predicaten indexeerbaar?
- Het aantal vergrendelingen verminderen: WHERE-voorwaarden verfijnen, indexen toevoegen, range-scans vermijden, vergrendelingslezen beperken.
- De transactieduur verkorten: interacties en externe oproepen uit de transactie verwijderen, result sets verkleinen.
- Herhalen en meten: controleer en vergelijk de piekwaarden opnieuw na de wijziging.
Deze aanpak voorkomt dat men op goed geluk te werk gaat. In plaats van de time-outs te verhogen, pak ik de oorzaken aan – dat is duurzamer en meestal ook sneller.
Operationele valkuilen vermijden
Er zijn drie zaken waar ik tijdens het gebruik extra op let: ten eerste schakel ik autocommit niet per ongeluk globaal uit – dat verlengt vergrendelingen ongemerkt. Ten tweede voorkom ik dat connection pools transacties doorgeven die al openstaande vergrendelingen bevatten. Ten derde gebruik ik savepoints gericht voor gedeeltelijke terugdraaiingen, maar verwacht ik niet dat ze de duur van de locks verkorten: de vergrendeling blijft bestaan tot de commit of rollback. Een strikte discipline in de applicatielaag leidt hier direct tot kortere wachttijden.
In het kort: de belangrijkste lessen
Row Locking zorgt voor gegevensconsistentie, maar alleen in combinatie met MVCC, de juiste isolatieniveaus en een goed indexontwerp komen de sterke punten ervan volledig tot hun recht. Ik houd transacties kort, filter gericht en gebruik FOR UPDATE alleen wanneer reservering vanuit functioneel oogpunt noodzakelijk is. Ik verminder conflicten door consistente toegangsvolgordes en duidelijke herhalingspogingen bij deadlocks. Ik kies isolatieniveaus per use case en observeer hoe gap- en next-key-locks uitwerken. Wie meet en regelmatig bijstelt, bereikt hoge Concurrentie zonder verrassingen.
Uiteindelijk zijn er drie dingen die tellen: kleine lock-objecten, korte verwerkingstijden en traceerbare querypaden. Met deze principes draaien MySQL-workloads betrouwbaar, zelfs als er veel gebruikers tegelijkertijd actief zijn. Ik zet in op herhaalbare tests, zinvolle statistieken en gerichte optimalisaties in plaats van grote aanpassingen. Zo blijven gegevens correct, blijven responstijden laag en komen deadlocks zelden voor. Dat is precies wat elk team verwacht van een responsieve Database.


