Erfolg der Löschung einiger mysql-Datensätze

C

comrat

Aktives Mitglied
Thread Starter
Dabei seit
27.12.2004
Beiträge
112
Reaktionspunkte
0
Hallo,

wie überprüft man professionell, ob die Löschung einiger Datensätze erfolgreich war? Sicherlich finde ich dazu eine eigene Lösung, aber, um unnötige Versuche zu vermeiden, hätte ich gerne vorher gewußt, welchen Weg man dazu grundsätzlich einschlagen sollte.

Fragt Ihr erst per select wieviele Datensätze betroffen sind, löscht diese und prüft dann mit mysql_affected_rows(), ob dieselbe Anzahl gelöscht wurde? Sicher fühle ich mich mit dieser Variante aber nur, wenn ich die Datenbanken vorher sperren konnte (alte Clipper/DBase-Erfahrung). Welche Stichwörter muß ich lesen um den lock und unlock durchzuführen?

Danke für jeden konstruktiven Hinweis.
 
result von mysql_query unzureichende Erfolgsprüfung?

Danke Katana,

ausschließlich das result von mysql_query() zu überprüfen scheint mir unzureichend. result kann mir nur mitteilen, daß ein syntaktischer oder ein semantischer Fehler vorlag oder die Zugriffsrechte unzureichend waren.

Die erwartete Zahl zu löschender Datensätze scheint unberücksichtigt zu bleiben in Deinem Beispiel; die unerwartete Zahl gelöschter ebenfalls.

Habe ich etwas übersehen?
 
nein, du hast schon recht ... auf die anzahl der gelöschten datensätze gehe ich in dem beispiel nicht ein ... du müsstest dann einfach noch mysql_affected_rows mit auswerten?
 
Sperrung auch bei delete nicht erforderlich?

Zitat-Anfang
Normalerweise müssen Sie Tabellen nicht sperren, weil alle einzelnen UPDATE-Statements atomisch sind. Kein anderer Thread kann mit einem aktuell ausgeführten SQL-Statement in die Quere kommen.
Zitat-Ende

Nur, wie sieht es mit einem Delete aus? Eine Sperrung brauche ich nur, wenn ich zwischen einem select und einem delete keine Veränderungen zulassen möchte, oder wenn ich die Ausführungszeit verringern möchte.

Einen deadlock, nicht-blockierungsfreies Sperren, scheint nicht stattfinden zu können, da, wenn ich das richtig verstanden habe, die Tabellen in einer festen, sortierten, Folge gesperrt werden.
 
Zuletzt bearbeitet von einem Moderator:
ja? und? verstehe dein problem wohl nicht ganz ...

befürchtest du, dass du auf daten zugreifen (wollen) könntest, die anderswo gerade gelöscht wurden/werden? falls ja, reicht eine prüfung in den routinen, die auf die daten zugreifen wollen ...

oder ist etwas anderes gemeint?
 
Ich dürste ;-) nach einem Wink, der mir sagt, wie Ihr Datensätze löscht. Sperrt Ihr die betroffenen Tabellen erst, oder besteht kein Risiko, daß während der Löschung Änderungen Anderer laufen, die ein konkurrierend produziertes, aber fehlerhaftes Ergebnis in der Datenbank zurücklassen?

Ist zum Beispiel eine Tabelle dafür zuständig, Bestände dreierlei Art synchron zu halten und werden die Bezeichner der Art durch einen Generationswechsel verschoben, dann darf während dieser Verschiebung keine Löschung stattfinden.

tab_artikel

tab_generation.art="alt"
tab_generation.art="aktuell"
tab_generation.art="neu"

Zu jedem Artikel gibt es in einer angehängten Tabelle drei Datensätze unterschiedlicher Generation.

Erzeugt eine Task gerade einen Datensatz .neu, verschiebt sie die Datensätze .alt und .aktuell. Löscht meine Task aber fast zeitgleich alle .alt mit einer passenden Filterung, dann greift die Verschiebung plötzlich ins Leere. Ups!

Wie handhabt Ihr so etwas? Einige Stichwörter in chronologisch sinnvoller Reihenfolge sollten mir reichen um auf den richtigen Weg zu kommen. Danke.
 
Zuletzt bearbeitet:
Das wird ja immer besser *grübel*

Zitat-Anfang
Zitat-Ende

So wird die Frage nach der Dringlichkeit der Tabellensperrung immer drängender. ;-)
 
Solche Fragen würde ich in de.comp.datenbanken.mysql stellen.
HTH
 
Datenbanken nutzt man, um ihnen die Aufgabe der strukturierten Datenhaltung zu überlassen, gerade auch mit konkurrierendem Zugriff. Jede Abfrage zu hinterfragen, hieße ja das DBMS nicht funktionieren. Sofern keine Fehlnutzung seitens des Programmierers vorliegt, kann man schon davon ausgehen, daß DBMS ihrem Job nachkommen!
 
Jede Abfrage zu hinterfragen, hieße ja das DBMS nicht funktionieren.

Hi, da hast du den Nagel auf den Kopf getroffen.

Wenn die ganze Debatte tatsächlich ein Thema ist mit technischem Hintegrund, dann heist das nur eins:

Das DBMS ist kaputt. --> anderes verwenden.

Gruß Rupa
 
Wieso gibt's überhaupt 3 Tabellen? Man könnte dem doch auch einfach ein Feld mit enum ('alt','aktuell','neu') mitgeben, worauf man nur noch updates fahren muss. Dann muss man keine Datensätze zwischen Tabellen verschieben und die Idizes bleiben auch erhalten. Wenn dann doch etwas gelöscht werden soll stellt man einfach noch das enum an die Bedingung. Oder hab ich jetzt irgendwie den Sinn der 3 Tabellen nicht verstanden?
 
Am einfachsten wäre es doch, nach dem löschen mittels einer mysql Abfrage gezielt nach den Datensätzen zu suchen. Wenn man nichts mehr findet sind Sie gelöscht.
 
Zurück
Oben Unten