Warum willst du das verhindern? Eine ID soll identifizieren und nichts weiter. Wenn du da aus anderen Gründen eine bestimmte Reihenfolge/Lückenlosigkeit/wasimmer benötigst, solltest du dein Konzept überdenken. Dafür ist der AI-ID-Mechanismus nicht ausgelegt.
Und was wäre, wenn die ID nicht global raufgezählt würde? Der erste Request bekommt die 1. Noch während die Transaktion läuft, kommt ein weiterer Request. Was soll dieser denn für eine ID bekommen? Doch nicht etwa dieselbe wie in der gerade nebenan laufenden Transaktion, auf das es beim Commit zur Katastrophe kommt? Die ID beim Rollback wieder zurückzustellen, ist unnötiger Aufwand und würde auch nur dann sinnvoll sein, wenn zwischenzeitlich keine (auto)committete Aktion stattfand.
Es geht nur um folgendes Problem: Wie bereits in meiner ersten Frage hier, bastel ich an einem kleinen Forum. Wenn man nun ein neues Thema eröffnet, werden 3 SQL-Statements fällig.
a) Query für die Tabelle boards
b) Query für die Tabelle threads
c) Query für die Tabelle posts
Da ich in der Tabelle posts bei jedem post jeweils einfügen muss zu welcher ThreadID er gehört, fange ich mit der Query für threads an und bekomme mit insert_id die gerade erstelle AI ID. Diese benutze ich bei der Query für die Tabelle posts um Sicherzustellen, dass alle posts auch dem richtigen Thread zugestellt sind.
Was aber wenn eine der 3 Teilquerys fehlschlägt? Dann kommt es zu Inkonsistenzen, die ich zu vermeiden versuche. Daher das autocommit(false) und die Überprüfung bei jeder der drei Teilquerys, ob sie nun valid durchgelaufen sind oder nicht. Wenn dem so war, führe ein commit() aus, wenn nicht rollback(). So weit ganz einleuchtend, oder? Mir ist dann nur eben aufgefallen, dass auch bei einem rollback() die AI ID immer weiter hochgezählt wird und da frage ich mich warum und was man dagegen tun kann.
Grob in Code:
if(QUERY1) !== false) { // Threads table
$ThreadID = $GLOBALS['Database']->getAffectedID();
if($ThreadID !== false) {
// Did find last affected ID Row
QUERY 2 und 3
else {
// Last affected Row didn't work
$Valid = false;
}
}
else {
// Threads table operation went wrong
$Valid = false;
}
Wenn ihr irgendwelche Verbesserungsvorschläge habt, nur raus damit. Ich bin zwar kein Anfänger mehr, aber ich würde mich schon gerne verbessern.