InnoDB Speicherengine Rollback

Daniel_CB

Aktives Mitglied
Hallo,

ich beschäftige mich gerade mit Transaktion sicheren Tabellen.

Da ich in der Doku gelesen habe das InnoDB Rollback unterstützt und die Struktur wichtig ist habe ich mich für INNODB mit Rollback beschäftig und leider noch nicht so wirklich verstanden.

In der Doku steht

START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;

wenn ich dieses richti verstanden hab müsste mein Statement so aussehen

START TRANSACTION;
UPDATE tree SET rgt=rgt+2 WHERE rgt >= $RGT;
UPDATE tree SET lft=lft+2 WHERE lft > $RGT;
INSERT INTO tree (name,lft,rgt) VALUES ('Halbaffen', $RGT, $RGT +1);
COMMIT;

was passiert wenn 2 User im Intranet Daten in dieses Modell einfügen. ist die Tabelle solange gesperrt bis eine Transaktion abgeschlossen ist?

weil beide werden als MYSQL user "miarbeiter" das statement auf die DB loslassen

Ich hoffe Ihr könnt mir helfen da ich eine DB vorstellung meinem "projektmanager" morgen vorstellen muss.

Daniel
 
QUOTE (Daniel_CB @ Mo 15.1.2007, 17:23)wenn ich dieses richti verstanden hab müsste mein Statement so aussehen

START TRANSACTION;
UPDATE tree SET rgt=rgt+2 WHERE rgt >= $RGT;
UPDATE tree SET lft=lft+2 WHERE lft > $RGT;
INSERT INTO tree (name,lft,rgt) VALUES ('Halbaffen', $RGT, $RGT +1);
COMMIT;

was passiert wenn 2 User im Intranet Daten in dieses Modell einfügen. ist die Tabelle solange gesperrt bis eine Transaktion abgeschlossen ist?

Das Grundprinzip ist korrekt.

Ob die ganze Tabelle gesperrt wird, könnte man - wäre das ein MS-SqlServer - so nicht sagen: Die Verbindung kann selbst die Sperrstufe festlegen. Das kann von SERIALIZABLE (= Tabellensperrung) bis sehr schwach gehen, so daß dazwischen Dirty Reads möglich wären.

Eine Tabellensperrung würde hier allerdings unnötigerweise alle rgt < $RGT sperren, wäre also eigentlich überflüssig. Wenn eine Sperre (hier für die rgt >= $RGT) angefordert wird, müßte dieser Zugriff warten, bis alle bestehenden Lesesperren abgebaut sind, dann kriegt er die exklusive Sperre und blockiert solange auch alle Lesezugriffe.
 
trotz mehrmaligen Probieren bekomme ich es nicht hin
sad.gif




SET AUTOCOMMIT=0;# MySQL lieferte ein leeres Resultat zurück (d. h. null Zeilen).
begin;# MySQL lieferte ein leeres Resultat zurück (d. h. null Zeilen).
UPDATE tree SET rgt=rgt+2 WHERE rgt = 2;# Betroffene Datensätze: 1
INSERT INTO tree (name,lft,rgt) VALUES ('Primaten',2,3);# Betroffene Datensätze: 1
ROLLBACK;# MySQL lieferte ein leeres Resultat zurück (d. h. null Zeilen).



was mache ich falsch
 
QUOTE (Daniel_CB @ Mo 15.1.2007, 19:03)SET AUTOCOMMIT=0;# MySQL lieferte ein leeres Resultat zurück (d. h. null Zeilen).
begin;# MySQL lieferte ein leeres Resultat zurück (d. h. null Zeilen).
UPDATE tree SET rgt=rgt+2 WHERE rgt = 2;# Betroffene Datensätze: 1
INSERT INTO tree (name,lft,rgt) VALUES ('Primaten',2,3);# Betroffene Datensätze: 1
ROLLBACK;# MySQL lieferte ein leeres Resultat zurück (d. h. null Zeilen).

Wenn Du eine Transaktion mit einem Rollback abschließt, dann wird natürlich nichts geändert.

Das ist doch der Sinn einer Transaktion, daß eine aus mehreren Schritten bestehende Operation entweder gar nicht oder vollständig ausgeführt wird.

Und die Begin Transaction / Commit / Rollback - Anweisungen geben - zumindest auf dem MS-SqlServer - auch nie etwas zurück, mySql verwende ich nicht, das wird da aber genauso sein.
 
Zurück
Oben