MySQL Transaktion C++
-
Guten Tag!
Ich entwickle unter Linux mit C++ eine Client Server Datenbankserver Anwendung.Einzelne MySQL-Anfragen sind auch überhaupt kein Problem, aber wie kann ich eine vielzahl von MySQL-Anfragen in einer Transaction in C++ senden?
Ich konnte leider kein gutes Beispiel dazu im Netzt finden.Das ist mal eine Anzahl an Anweisungen die ich in einer Transaction packe:
SET AUTOCOMMIT = 0; LOCK TABLES T_Stock WRITE, T_Stocklist WRITE, T_Storehouse WRITE; SELECT @stock:=Stock FROM T_Stock WHERE Storehouse_ID = $sthid and Article_ID = 1; SELECT @tstock:=Total_Stock FROM T_Stocklist WHERE Article_ID = 1; UPDATE T_Stock SET Stock =@stock+100 WHERE Storehouse_ID = 1 and Article_ID = 1; UPDATE T_Stocklist SET Total_Stock =@tstock+100 WHERE Article_ID=1; UNLOCK TABLES; COMMIT;
Nur wie mach ich das jetzt in C++?
Muß ich die Anfragen alle einzeln an die Datenbank senden oder kann man das auch alles zusammen lossenden?
... sprintf(req_artid,"SELECT Article_ID FROM T_Stocklist WHERE Article_ID=%d", artid); cout << req_artid << endl; state=mysql_query(mysqlconn, req_artid); result=mysql_store_result(mysqlconn); ...
Muß ich so jetzt alle einzeln lossenden und ist dann noch eine Transaktion gewährleistet?
Hat vielleicht hier jemand einen Link oder ein Beispiel für eine Transaktion mit mehreren Anweisungen in C++?
Gruß skontox
-
Hat hier denn vielleicht irgend jemand ein gutes Tutorial zu Mysql und Transaktionen?
Würde mich sehr freuen, denn irgendwie klappt das bei mir nicht
BEGIN
...
COMMITWenn ich kein COMMIT setze aktualisiert er trotzdem die Datenbank.
Und ich benutzt InnDB. Die können ja Transaktionen.Ich weiß auch nicht mehr weiter. Biiiitte ich bracuh Hilfe!
Gruß skontox
-
SET AUTOCOMMIT = 0;
Musst du setzen da standardm. sofort geschrieben wird.
Dazwischen führe deine Statements aus.
zum ende dann COMMIT oder ROLLBACK.Das es bei dir nicht geht liegt IMHO daran das du keine Transactiontables verwendest wie z.B. innodb.
MyISAM kennt keine Transactions und IMHO werde diese auch dadurch beschädigt
-
Hallo UNIX-TOM!
Besten Dank erstmal für Deine Antwort!
Da hast Du natürlich recht, dass man InnoDB benutzen muß. Das habe ich aber auch alles gemacht!Das war nicht das Problem.
Ich hab InnoDB verwendet und auch SET AUTOCOMMIT=0; Und dann COMMI;
Aber ich habe gerade festgestellt, dass ich in meiner Transaktion
Tables gelocked habe und das klappt nicht im Zusammenhang mit Transaktionen.
Habs gerade herausgefunden, stand unter:http://www.mysql.com/doc/en/LOCK_TABLES.html :
NOTE: LOCK TABLES is not transaction-safe and will implicitly commit any active transactions before attempting to lock the tables.
Das Problem ist demnach gelöst.;-)
Dass kommt, wenn man das Kleingedruckte nicht liest!Besten Dank nochmal!