Mehrere Mysql-Anweisungen in einem Thread?
-
Guten Tag,
Ich versuche mit C++ eine Datenbank mit verschiedenen Anweisungen in einem Thread zu modifizieren, das klappt aber leider nicht. Wenn ich eine Anweisung losschicke geht das, aber nicht wenn ich mehrere zusammenpacke.
Aber soweit ich weiß muß das in einem Thread geschehen, denn ich will das ganze als Transaktion laufen lassen.
hier mal mein Code Auszug:
... sprintf(book, "SET AUTOCOMMIT = 0; LOCK TABLES Lagerbestand WRITE, Artikelstamm WRITE; UPDATE Lagerbestand SET Bestand=5 WHERE Lager_ID=1 and Artikel_ID=1; UPDATE Artikelstamm SET Gesamtbestand=5 WHERE Artikel_ID=1; UNLOCK TABLES; COMMIT;"); state=mysql_query(conn,book); // send SQL-statement to the MYSQL-Server ...
Das klappt leider nicht! Aber wenn ich jedes einzel sende, ist es doch nicht mehr in einem Thread, und dann klappt das nicht, oder?
Ich meine mit nicht klappen. Der erste Thread würde die Transaktion starten. Der zweite würde die Tables locken usw. Das muß doch alles in einem Thread geschehen, oder?Wie würdet Ihr das am besten machen?
Gruß skontoxGruß skontox
-
Öhm, ich weiss zwar nicht wie's bei MySql ist, aber ob die Statements nun als ein Kommando oder getrennt geschickt werden ist bei "normalen" Datenbanken eigentlich völlig unerheblich. Transaktionen gelten immer für eine Connection, nicht für einen Thread, ein Statement, ein Sonstwas.
Wie gesagt, meine MySql-Erfahrungen belaufen sich auf ein "Gesehen, gelacht, gelöscht", aber würde mich überraschen wenn es dort anders wäre als bei richtigen Datenbanken...
-
http://www.mysql.de/doc/de/Transactional_Commands.html
Ließ dir aber durch welches Datenbankformat du benutzen musst um Transactions zu verwenden. (InoDB, ...)
-
Besten Dank frenki und Unix-Tom!
zu UNIX-TOM: Die Statements sind kein Problem! Die kenne ich!
zu frenki: Das wäre ja super! Dann ist das ja kein Problem. Ich schicke alles einzel nacheinander!
Gruß skontox
-
Ich spreche auch nicht von den SQL-Commandos.
Ich spreche vom Datenbankformat. MYISAM unterstützt keine Transaction
-
Thread - Ich glaub da ist nen kleines Verstaendigungsproblem ... Ichdenke du meinst mit Thread nen SQL-Befehl ?
Falls du doch threads meinst:
1. bist dir sicher, dass die mysqllib selber threadsicher ist ?
mysqld selber intern arbeitet sicher mit mehreren threads. schickt aber die informationen zum mysclient, welcher in deinem thread laeuft. Da drinn werden wilde sachen wegens dem locken und den waitings gemacht ... ich glaub nicht, das die von haus aus selber threadsicher ist, fuer ein connection object wohlgemerkt. ... Normal musst dann selber fuer sorgen ...also nen gleichzeitiges absetzen von 2 SQLSTatements von 2 unterschiedlichen Threads aus ... weiss nicht, ob er einen davon lockt ?
Kann man zwar selber machen, aber entbehrt dann aller logic, dann brauchst multithreading an der stelle ja gar ned.wenn multithreading, dann mit mehrenen connections (die die gleichen parameter haben konenen) ... klingt auch logisch, weil er dann die ganzen CacheObjecte fuer jede connection sepoerat aufbaut, und die SQL Anweisung des einen threads nicht das resultset der SQL-Anweisung des anderen threads ueberschreiben kann.
Ausserdem funktioniert dein locktable dann auch korrekt Mit gleichen connectionobjecten, koennte der eine thread das lock des anderen aufheben ...falls du SQL-Befehl meinst:
Nen SQL befehl ist eine Anweisung fuer die DB fuer eine taetigkeit, die genau eine oder keine Ergebnissmenge zurueckliefern kann.
Was du machst, ist mehrere SQL-Befehle in einen CLient-Befehl zu packen, das mag er sicher nicht. Logisch gesehen auch klar, welches Resultset soll er dir zurueckliefern, wenn Du mehrere selects in einen Befehl knallst ?Ne Transaction ist ne Verarbeitungseinheit auf userebene definiert. Sprich, ne Transaktion kann mehre Sql befehle beinhalten und wird vom user selber direkt oder indirekt per SQL befehle gesteuert.
dazu gibts normal regeln.
z.B. bei Oracle, ich nehm mal an bei mysql wirds ned viel anders sein.1. jede DDL anweisung (Create, alter delete(als delete Table, ned delete from) ... etc) bewirkt ein Abschliesen einer laufenden Transaktion !!! die DDL Anweisung selber laeuft ausserhalb von transaktionen, sprich, kann nicht rueckgaengig gemacht werden
2. das beenden einer Connection schliesst deine transaktion ab !
3. ein commit() schliesst deine transaktion ab ...
Also, brauchst dir wegen der transaktion keine sorgen machen, solange keine Tabellenstruktur aenderst, dein connectionobject ned schliesst, oder dein Programm abschmiert
, bleibst innerhalb ner transaktion und kannst alles mit rollback rueckgaengig machen ! ....
Ciao ...
-
Guten Tag!
zu UNIX-TOM:
Ich verwende InnoDB, die kann Transaction!
Besetn Dank!zu RHBaum:
Das kann gut angehen, dass ich mich da nicht richtig ausgedrückt habe.
Herzlichen Dank für Deine ausführlichen Erklärungen.
Jetzt ist mir das auch klar geworden.Ich wollte hier im Forum nur nochmal nachfragen, ob ich anstelle alle Anweisungen in eine Datenbankanweisung zupacken auch alle einzeln nacheinander an die Datenbank zuschicken und somit trotzdem die Integrität der Datenbank nicht gefährde. Ich muß es ja sogar so machen, denn wie Du mir erklärt hast und ich auch feststellen mußte, kann man nicht alle Anweisungen auf einmal schicken.
Besten Dank Euch allen!
Gruß skontox