sql >> Database >  >> RDS >> Mysql

MySQL select for update retourneert een lege set, ook al bestaat er een rij

Gezien de afhankelijkheid van het hoger of lager instellen van de waarde van een geïndexeerde kolom, lijkt het erop dat de vergrendeling daadwerkelijk op het indexitem wordt geplaatst. De database-engine scant de index en stopt bij de eerste vergrendelde invoer, wachtend tot deze wordt vrijgegeven.

Wanneer de eerste transactie is vastgelegd, wordt de index ontgrendeld en gaat de wachtende transactie door met het scannen van de index. Doordat de waarde is verlaagd, staat deze nu eerder in de index. Dus de hervatte scan ziet het niet omdat het dat punt al gepasseerd is.

Probeer de volgende test om dit te bevestigen:

  1. Maak twee rijen, met waarden 2 en 3.
  2. Voer in beide transacties de SELECT ... FOR UPDATE
  3. In transactie 1, verander 2 in 1, 3 in 4.
  4. Transactie uitvoeren 1.

Als mijn gok correct is, zou transactie 2 alleen de rij met 4 moeten retourneren.

Dit lijkt mij een bug, omdat ik denk dat je nooit zulke gedeeltelijke resultaten zou moeten krijgen. Helaas is het moeilijk om hiernaar te zoeken op bugs.mysql.com, omdat het woord "voor" bij het zoeken wordt genegeerd omdat het te kort of te algemeen is. Zelfs het citeren van "voor update" lijkt geen bugs te vinden die alleen deze zin bevatten.




  1. SQL Server gebruiken als afbeeldingsopslag

  2. Standaardschema wijzigen voor gebruiker

  3. Hoe het KNN Machine Learning-model te gebruiken met 2UDA - PostgreSQL en Orange (deel 1)

  4. Laravel voert andere uitvoer uit dan MySQL-query