it-swarm.com.de

Warum springt das automatische Inkrementieren um mehr als die Anzahl der eingefügten Zeilen?

Ich bin sehr beunruhigt über dieses seltsame Verhalten, das ich im Wert auto_increment In der bidID einer Bids-Tabelle sehe, nachdem ich eine Masseneinfügung mit einer gespeicherten Prozedur durchgeführt habe:

INSERT INTO Bids (itemID, buyerID, bidPrice)
 SELECT itemID, Rand_id(sellerID, user_last_id), FLOOR((1 + Rand())*askPrice)
 FROM Items
 WHERE closing BETWEEN NOW() AND NOW() + INTERVAL 1 WEEK ORDER BY Rand() LIMIT total_rows;

Wenn beispielsweise der BidID-Wert auto_increment Zu Beginn 101 ist und ich 100 Zeilen eingefügt habe, wird der Endwert 213 anstelle von 201. Die BidIDs dieser eingefügten Zeilen werden jedoch nacheinander mit maximal 201 ausgeführt.

Nachdem Sie Folgendes überprüft haben:

SHOW VARIABLES LIKE 'auto_inc%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 1     |
| auto_increment_offset    | 1     |
+--------------------------+-------+

Ich habe keine Ahnung, warum es passiert. Was könnte den Sprung in den Wert auto increment Verursachen?

11

Dies ist nicht ungewöhnlich und es gibt mehrere Ursachen. Manchmal liegt es an Optimierungen, die der Abfrageläufer vornimmt, um Konfliktprobleme mit der Zählerressource zu reduzieren und die Effizienz zu verbessern, wenn die betroffene Tabelle gleichzeitig aktualisiert wird. Manchmal liegt es an Transaktionen, die explizit zurückgesetzt wurden (oder implizit zurückgesetzt wurden, weil ein Fehler aufgetreten ist).

Die einzigen Garantien von einem auto_increment Spalte (oder IDENTITY in MSSQL und die anderen Namen, die das Konzept verwendet) ist, dass jeder Wert eindeutig und niemals kleiner als ein vorheriger ist: Sie können sich also auf die Werte für die Bestellung verlassen, aber Sie können Verlassen Sie sich nicht darauf, dass sie keine Lücken haben.

Wenn Sie möchten, dass die Werte der Spalte überhaupt keine Lücken aufweisen, müssen Sie die Werte entweder selbst verwalten, entweder in einer anderen Ebene der Geschäftslogik oder in der Datenbank über einen Trigger (achten Sie jedoch auf mögliche Leistungsprobleme mit Triggern), wenn Wenn Sie Ihre eigenen rollen, müssen Sie sich mit allen Problemen in Bezug auf Parallelität/Rollback/Bereinigung nach dem Löschen/andere Probleme auseinandersetzen, die die DB-Engines umgehen, indem sie Lücken zulassen.

10
David Spillett