Het hangt allemaal af van het ISOLATION LEVEL
je hebt ingesteld.
Je kunt zien welke je hebt ingesteld met deze vraag:
select @@global.tx_isolation, @@session.tx_isolation;
Voordat ik de verschillende isolatieniveaus uitleg, wil ik eerst uitleggen welke problemen ze proberen te vermijden:
-
De vuile lezing :Gegevens van een nog niet afgeronde transactie worden gelezen door een andere transactie.
-
De verloren update :Twee transacties wijzigen parallel een invoer in een tabel. Wanneer beide transacties zijn voltooid, wordt slechts één wijziging toegepast.
-
De niet-herhaalbare lees :Herhaalde uitlezingen leiden tot verschillende resultaten.
-
De phantom read :Tijdens een transactie voegt een andere transactie tabelgegevens toe of verwijdert deze.
Nu voor de verschillende isolatieniveaus.
Lees Niet-vastgelegd :
Met dit isolatieniveau negeren leesbewerkingen elke vorm van vergrendeling, daarom kunnen alle bovengenoemde problemen optreden.
Lees Toegewijd :
Dit isolatieniveau stelt een schrijfblokkering in voor de hele transactie op objecten die moeten worden gewijzigd. Leesvergrendelingen worden alleen ingesteld bij het lezen van gegevens. Daarom kunnen niet-herhaalbare lees- en fantoomlezen optreden.
Herhaalbare lezing :
Met dit isolatieniveau wordt ervoor gezorgd dat terugkerende leesbewerkingen altijd hetzelfde resultaat opleveren als de parameters hetzelfde zijn. Er zijn vergrendelingen ingesteld voor lees- en schrijfbewerkingen voor de totale duur van de transactie. Daarom kunnen alleen fantoomlezingen plaatsvinden.
Serializeerbaar :
Het hoogste isolatieniveau garandeert dat het resultaat van parallel lopende transacties hetzelfde is alsof de transacties na elkaar zouden worden uitgevoerd. De meeste databases voeren die transacties niet echt na elkaar uit, dat zou een te groot prestatieverlies zijn. Daarom kan het gebeuren dat één transactie wordt afgebroken. MySQL realiseert dit bijvoorbeeld met MVCC (Multi-Version Concurrency Control). Google maar eens als je meer wilt weten. Het is teveel voor dit antwoord.
Al met al verklaart deze tabel het ook:
| Lost updates | Dirty Read | Non-Repeatable Read | Phantom Read
---------------------------------------------------------------------------------
Read Uncommitted | possible | possible | possible | possible
Read Committed | impossible | impossible | possible | possible
Repeatable Read | impossible | impossible | impossible | possible
Serializable | impossible | impossible | impossible | impossible
- In deze handmatige invoer is wat meer informatie erover en hoe het isolatieniveau in te stellen.
Dit alles is slechts theorie voor relationele databasebeheersystemen. Aangezien MySQL MVCC (multi-version concurrency control) gebruikt, vinden er echter geen phantom reads plaats bij gebruik van InnoDB en herhaalbaar leesisolatieniveau .
Van de handleiding
: