# MySql kein Rollback



## Catscratch1 (25. Aug 2004)

Ich finde es übel, dass MySQL keinen Rollback beherscht.
Da macht man eine JDBC Applikation, und kann, wenn eine Relation nicht
komplett geparst werden kann, keinen Rollback durchführen.

Das ist ein Unding finde ich.
Werde jetzt auf PostgreSQL umsteigen. Die ist wesentlich mächtiger und auch OpenSource


----------



## P3AC3MAK3R (25. Aug 2004)

Soweit ich informiert bin, unterstützt MySQL durchaus Transaktionen und somit Rollbacks.

Ich bin mir aber nicht so ganz sicher, ob Du den Sinn von Transaktionen überhaupt verstanden hast.


----------



## DP (25. Aug 2004)

da sollte man sich erstmal informieren und dann den dicken machen 

((Connection)this.cm.getConnection()).setAutoCommit(false);
stmt.execute(sql)

wenn execute okay: ((Connection)this.cm.getConnection()).commit();
bei fehlern: ((Connection)this.cm.getConnection()).rollback();

und zum schluss wieder: ((Connection)this.cm.getConnection()).setAutoCommit(true);


----------



## bygones (25. Aug 2004)

Catscratch1 hat gesagt.:
			
		

> Werde jetzt auf PostgreSQL umsteigen. Die ist wesentlich mächtiger und auch OpenSource


vielleicht ist es nur Werbung, aber auf http://www.mysql.com


> The world's most popular open source database


----------



## Grizzly (25. Aug 2004)

Populärer ist sie schon. Aber dann hat es sich aber auch.  

MySQL unterstützt in den meisten Version keine Transaktionen und damit auch keine Rollbacks. Soviel ich noch weiss, muss man die Datenbank / die Tabellen auch zusätzlich noch in einen bestimmten Format anlegen. Genaueres ist aber auf der MySQL Webseite nachzulesen.


----------



## thE_29 (26. Aug 2004)

außerdem ist die jetengine(access) woll ein größerer vollscheiss als mysql, weil die fast gar keine oracle befehle kennt!

die kennt net mal lower, oder upper!!


----------



## DP (26. Aug 2004)

wieso, wer redet denn von access?!


----------



## foobar (26. Aug 2004)

Grizzly hat gesagt.:
			
		

> Populärer ist sie schon. Aber dann hat es sich aber auch.
> MySQL unterstützt in den meisten Version keine Transaktionen und damit auch keine Rollbacks. Soviel ich noch weiss, muss man die Datenbank / die Tabellen auch zusätzlich noch in einen bestimmten Format anlegen. Genaueres ist aber auf der MySQL Webseite nachzulesen.


Um Transaktionen und Foreignkeys nutzen zu können, mußt du die entsprechenden Tabellen auf InnoDB umstellen. Dazu muß als erstes die my.cnf angepasst werden:

```
#skip-innodb
# Uncomment the following if you are using InnoDB tables
innodb_data_home_dir = /opt/lampp/var/mysql/
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /opt/lampp/var/mysql/
innodb_log_arch_dir = /opt/lampp/var/mysql/
```

Jetzt kann man die Tabellen ganz einfach auf InnoDB umstellen

```
alter table mytable
type=InnoDB
```

Ansonsten empfehle ich MaxDB. Das ist ein Zusammenschluß von Mysql und SAPDB. MaxDB bietet den kompletten Funktionsumfang eines Enterprise RDBMS (Views, Trigger, Stored Procedures etc.pp.)


----------



## DP (26. Aug 2004)

mal was anderes zu mysql: wo sind denn die log-files zu finden, wo alle abgesetzten dml-statements gespeichert werden?


----------



## foobar (26. Aug 2004)

http://dev.mysql.com/doc/mysql/en/Log_Files.html


> By default, all logs are created in the mysqld data directory. You can force mysqld to close and reopen the log files (or in some cases switch to a new log) by flushing the logs.


----------



## Guest (26. Aug 2004)

So zu Rollback:

Also natürlich sind die Methoden setAutoCommit(false) und rollback und commit da. Bin ja nicht blöd.

Aber wer die Doku liest, ist klar im Vorteil:

Der MySQL JDBC Treiber hat nur leere Methoden für rollback und commit und hat sie daher nicht implementiert,
da im MySQL Server die Funktionen nicht implementiert sind. Daher hat ein Test dieser Funktionen, bevor ich die Doku gelesen habe, nicht funktioniert!

Also MySQL ist sehr schlank und schnell, aber hat sehr wenige Funktionen!!


----------



## Catscratch1 (26. Aug 2004)

Wie gesagt, Transaktionen sind jedenfalls im JDBC Treiber nicht implementiert.

Und sehrwohl kenn ich mit Transaktionen aus.
Jedoch ist mein Beispiel etwas zu kompliziert, um es zu erklären.

Jedenfalls handelt es sich um ein Relationen Modell in der 3. Normalform und ist sehr komplex,
so dass mir Transaktionen von Vorteil gewesen wären.
Leider kann ich nix anderes nehmen, weil mein Chef mir nur diese DB gestellt hat.

Aber dem Ingenieur ist nix zu schwör! Daher habe ich einen halben "Rollback" selbst gebaut!


----------



## DP (26. Aug 2004)

kann dein eigener rollback auch nen rollback machen, wenn der server platzt?


----------



## Guest (26. Aug 2004)

nein, deswegen habe ich auch gesagt ein halber.
wenn anhand irgendeines verbindungsabbruchs, fehlerhafte daten, oder sonst was,
ne transaktion schief geht.
die alten zustände werden gespeichert. geht was schief, werden die änderungen gelöscht und
das alte zurückgeschrieben.

mehr kann ich da leider nicht machen, weil erstens zu viel aufwand, zweitens ein eigenes DBMS zu schreiben ist auch schwachsinn!


----------



## Dangermouse (4. Sep 2007)

Hallo Leute!

Ich habe ein echtes Problem mit der Rollback Funktion. Zum testen habe ich mir ein kleines Programm geschrieben mit einer Hand voll Inserts. Ich erwarte nun, dass kein Insert durchgeführt wird, wenn eins schiefgeht. Ist aber nicht so. Die Inserts, die fehlerfrei sind, werden ausgeführt und das letzte Fehlerbehaftete eben nicht. Schon komisch? Wo ist mein Fehler?

Vielen Dank

Stefan


```
import java.sql.*;
     
public class DBConnection {

	public static void main(String args[]) {
		  
		Connection con = null;

		try {
			Class.forName("com.mysql.jdbc.Driver");

		} catch(java.lang.ClassNotFoundException e) {
			System.err.print("ClassNotFoundException: "); 
			System.err.println(e.getMessage());
		}

		try {
			
			con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "user", "test");
			con.setAutoCommit(false);
			Statement statement = con.createStatement();
			     
			statement.execute("INSERT INTO Test VALUES(1, 'Andi')");
			statement.execute("INSERT INTO Test VALUES(2, 'Bandi')");
			statement.execute("INSERT INTO Test VALUES(3, 'Candi')");
			statement.execute("INSERT INTO Test VALUES(3, 'Dandi')"); //duplicate key!
			con.commit();
			con.setAutoCommit(true);
			   
			statement.close();
			con.close();      
		}
		catch(SQLException e)
		{
			e.printStackTrace();
			try {
				con.rollback();
			}
			catch (SQLException ex){}
		}
	}
}
```


----------



## tuxedo (5. Sep 2007)

@Dangermouse 



			
				Anonymous hat gesagt.:
			
		

> Aber wer die Doku liest, ist klar im Vorteil:
> 
> *Der MySQL JDBC Treiber hat nur leere Methoden für rollback und commit und hat sie daher nicht implementiert*,
> da im MySQL Server die Funktionen nicht implementiert sind. Daher hat ein Test dieser Funktionen, bevor ich die Doku gelesen habe, nicht funktioniert!



Nicht nur wer die Doku ließt ist im Vorteil. Im Thread mitlesen hilft auch des öfteren ;-)


----------



## FenchelT (5. Sep 2007)

Catscratch1 hat gesagt.:
			
		

> Ich finde es übel, dass MySQL keinen Rollback beherscht.
> Da macht man eine JDBC Applikation, und kann, wenn eine Relation nicht
> komplett geparst werden kann, keinen Rollback durchführen.
> 
> ...





Habe meinen Beitrag wieder geloescht. Sehe ja jetzt erst, dass der Thread 2k4 eroeffnet wurde  :roll:


----------



## Dangermouse (5. Sep 2007)

Danke für die schnelle Antwort!

Da hätte ich mir mal die Doku schnappen sollen. Was die Infos in diesem Thread angeht: Ich hatte gehofft, dass von 2004 bis heute sich diesbezüglich was bei MySQL getan hat.

Grüße

Stefan


----------



## FenchelT (5. Sep 2007)

Dangermouse hat gesagt.:
			
		

> Danke für die schnelle Antwort!
> 
> Da hätte ich mir mal die Doku schnappen sollen. Was die Infos in diesem Thread angeht: Ich hatte gehofft, dass von 2004 bis heute sich diesbezüglich was bei MySQL getan hat.
> 
> ...



Dann haette ich es doch stehen lassen koennen  :roll: 

In der Doku zur Version 5-1 in Kapitel 13.4 steht alles rund um Transaktionen in MySQL, die es sehr wohl gibt.
Es hat sich also was getan.

Gruesse


----------



## Dangermouse (5. Sep 2007)

alex0801 hat gesagt.:
			
		

> @Dangermouse
> 
> 
> 
> ...




Dein Beitrag hat mich nochmal veranlasst in die Doku zu schauen!  ;-)
Und siehe da. *Rollbacks funktionieren*, man muss allerdings die Speicherengine auf *"InnoDB"* stellen. MyISAM bietet diese Funktion nicht.

Nur so nebenbei: Spricht irgendetwas gegen InnoDB?

Vielen Dank auch nochmal an FenchelT

Stefan


----------

