sql >> Database >  >> RDS >> Mysql

MySQL AUTO_INCREMENT wordt niet ROLLBACK

Zo kan het niet werken. Overweeg:

  • programmeer één, je opent een transactie en voegt deze in een tabel FOO in die een autoinc primaire sleutel heeft (willekeurig zeggen we dat het 557 krijgt voor zijn sleutelwaarde).
  • Programma twee begint, het opent een transactie en voegt in tabel FOO 558 toe.
  • Programmeer twee invoegingen in tabel BAR die een kolom heeft die een refererende sleutel is voor FOO. Dus nu bevindt de 558 zich in zowel FOO als BAR.
  • Programma twee wordt nu vastgelegd.
  • Programma drie start en genereert een rapport uit tabel FOO. Het 558-record wordt afgedrukt.
  • Daarna rolt programma één terug.

Hoe haalt de database de 557-waarde terug? Gaat het naar FOO en verlaagt het alle andere primaire sleutels groter dan 557? Hoe repareert het BAR? Hoe wist het de 558 afgedrukt op de output van het rapportprogramma drie?

Om dezelfde reden zijn de volgnummers van Oracle ook onafhankelijk van transacties.

Als je dit probleem in constante tijd kunt oplossen, weet ik zeker dat je veel geld kunt verdienen op het gebied van databases.

Nu, als u een vereiste heeft dat uw auto-incrementveld nooit gaten mag hebben (bijvoorbeeld voor controledoeleinden). Dan kunt u uw transacties niet terugdraaien. In plaats daarvan moet u een statusvlag in uw administratie hebben. Bij de eerste invoeging is de status van het record "Incomplete", dan start u de transactie, doet u uw werk en werkt u de status bij naar "concurreren" (of wat u ook maar nodig heeft). Wanneer u zich vervolgens vastlegt, is het record live. Als de transactie wordt teruggedraaid, is het onvolledige record nog steeds aanwezig voor controle. Dit zal u veel andere hoofdpijn bezorgen, maar het is een manier om met audittrails om te gaan.



  1. Verbinding maken met MySQL met Node.js

  2. Zorg voor PL/SQL-uitvoer in realtime

  3. Door komma's gescheiden resultaten in SQL

  4. 10 feiten over het monitoren van databaseprestaties die u misschien zullen verbazen