69bruno hat geschrieben: 25.09.2021 17:06
Beim Einlesen die Anzahl Datensätze zählen und vor dem zurückschreiben erneut zählen. Sind sie gleich, überschreiben. Sind sie unterschiedlich, Prozedur neu starten.
Das ist nicht ganz so simpel, weil in der Tabelle ständig Bewegung ist. Die Tabelle kann je nach Besucher-Situation zwischen 1 und x Records enthalten und veraltete Einträge werden gelöscht. Die Tabelle enthält also keine statischen Datensätze bei denen nur neue dazu kommen würden, sondern eine dynamische Abbildung der Besucher-Situation bei der Records hinzugefügt, geändert und gelöscht werden.
oxpus hat geschrieben: 25.09.2021 18:43
Wenn es aber darum geht, den eigenen "Zyklus" unbehindert durchzuführen, wären die Befehle
$db->sql_transaction('begin');
am Anfang und
$db->sql_transaction('commit');
am Ende des gesamten Blocks hilfreich.
Crizzo hat mich zwischenzeitlich auch auf diese Funktion hingewiesen. Allerdings war nicht klar, ob die Querys innerhalb eines Transaction Blocks tatsächlich am Stück ausgeführt werden und solange alle anderen Schreibzugriffe auf die Tabelle pausiert sind.
Dann werden alle Aktionen nacheinander ohne die Möglichkeit von äußeren Störungen ausgeführt.
Okay, das wäre ganz exakt das was ich suche. Das heisst wenn während der Ausführung der 3 Querys andere Schreibzugriffe auf die Tabelle eintreffen würden, dann würden diese erst ausgeführt werden, wenn der Transactions Block erledigt ist?
Allerdings verhindert das wie gesagt nicht, das bis zur ersten auszuführenden SQL-Anweisung bereits jemand anders in der Datenbank etwas ändert.
Daher wäre es ratsam, die SQL-Anweisungen im Programmablauf so zu formulieren, das sie mit dem vorhandenen Ergebnis arbeiten und nicht erst Daten ausliest, verarbeitet und erst danach die Änderungen in die Datenbank zurückschreibt.
Die Daten selbst wären in dem Fall nicht von Interesse. Die Records sollen bleiben wie sie sind, es soll einfach nur der Index aller Records neu aufgebaut werden, beginnend bei 1. Sobald das erledigt ist, kann ich
auto_increment
auf 1 setzen, wodurch es von MySQL automatisch auf die letzte Record Nummer plus 1 gesetzt wird.
Wenn es Dir aber nur um den neuen Aufbau eines Tabellen-Indexes geht, kannst Du mit $db->sql_index_drop();
den Index löschen
und mit $db->sql_create_primary_key();
selbigen wieder aufbauen.
Den Rest erledigt dann die Datenbank alleine, auch den Stopp aller anstehenden Schreibzugriffe.
Klingt ebenfalls interessant. Hab etwas gebraucht bis ich herausfand wie ich das einbinden muss, damit ich diese beiden Funktionen nutzen kann. Problem ist jedoch, ich weiss nicht was da bei
$index_name
erwartet wird. Ich bin vom Spaltenname des Indexes ausgegangen, aber das scheint es wohl nicht zu sein: "Can't DROP 'wwh_id'; check that column/key exists [1091]". Die Doku ist hier leider auch null hilfreich und ich fand bei mir auch keine Ext die
$db->sql_index_drop();
nutzen würde.
Was das angeht, tappe ich also noch im dunkeln. Aber mir wäre die Transactions Methode eh wesentlich lieber, weil ich dadurch auch gleich generell eine Lösung für bestimmte andere Probleme hätte.