sql >> Database teknologi >  >> RDS >> Mysql

Hvordan låser jeg på en InnoDB-række, der ikke eksisterer endnu?

Selvom svaret ovenfor er sandt, idet en SELECT ... FOR UPDATE vil forhindre samtidige sessioner/transaktioner i at indsætte den samme post, er det ikke den fulde sandhed. Jeg kæmper i øjeblikket med det samme problem og er kommet til den konklusion, at SELECT ... FOR UPDATE er næsten ubrugelig i den situation af følgende årsag:

En samtidig transaktion/session kan også foretage en VÆLG ... TIL OPDATERING på den samme post-/indeksværdi, og MySQL vil med glæde acceptere det med det samme (ikke-blokerende) og uden at smide fejl. Så snart den anden session har gjort det, kan din session selvfølgelig ikke indsætte posten mere. Hverken din eller den anden session/transaktion får nogen information om situationen og tror, ​​de trygt kan indsætte posten, indtil de rent faktisk forsøger at gøre det. Forsøg på at indsætte fører derefter enten til dødlås eller til en duplikatnøglefejl, afhængigt af omstændighederne.

Med andre ord, SELECT ... FOR UPDATE forhindrer andre sessioner i at indsætte de respektive record(s), MEN selvom du laver en SELECT ... FOR UPDATE og den respektive record ikke findes, er chancerne for, at du faktisk ikke kan indsæt den post. IMHO, der gør metoden "først forespørgsel, så indsæt" ubrugelig.

Årsagen til problemet er, at MySQL ikke tilbyder nogen metode til virkelig låse ikke-eksisterende poster. To samtidige sessioner/transaktioner kan låse ikke-eksisterende poster "TIL OPDATERING" på samme tid, noget som egentlig ikke burde være muligt, og som gør udviklingen væsentligt vanskeligere.

Den eneste måde at omgå dette på ser ud til at være at bruge semafortabeller eller låse hele bordet ved indsættelse. Se venligst MySQL-dokumentationen for yderligere reference om låsning af hele tabeller eller brug af semafortabeller.

Bare mine 2 cents ...



  1. Hvordan kan jeg implementere commit/rollback for MySQL i PHP?

  2. Tilslutning af RazorSQL til Salesforce.com

  3. Neo4j - Slet et forhold ved hjælp af Cypher

  4. Hvordan indsætter man en fil i MySQL-databasen?