Announcement

Collapse
No announcement yet.

Frage zu SqlConnection Klasse

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Frage zu SqlConnection Klasse

    Code:
    sqlConnection1.Open();
    SqlCommand command = sqlConnection1.CreateCommand();
    SqlTransaction transaction;
    transaction = sqlConnection1.BeginTransaction("SampleTransaction");
    command.Connection = sqlConnection1;
    command.Transaction = transaction;
    
    command.CommandText = "DROP TABLE [dbo].[Assistenten]";
    command.ExecuteNonQuery();
    
    command.CommandText = "Insert into Assistenten(PersNr, Name) VALUES (101, 'Peter Muster')";
    command.ExecuteNonQuery();
    
    transaction.Rollback();
    Meine Frage bezieht sich darauf, wie die transaction genau arbeitet.
    Im Beispiel lösche ich die Tabelle Assistenten und versuche danach einen neuen Assistenten anzulegen. Das klappt natürlich an dieser Stelle nicht, weil es die Tabelle nicht mehr gibt.

    Mache ich nun ein Rollback, so ist die Tabelle wieder da. Wie geht das?
    Ich meine löscht er sie nur temporär und weiß dann, dass er keine neue Daten einspielen kann? Und bei einem Rollback schmeißt er die Änderungen dann einfach weg?
    Weil die Daten die ursprünglich in der Tabelle waren sind auch noch in Assistenten enthalten.

    Wäre nett, wenn mir das jemand mal genauer erklären könnte.

    So wie ich das jetzt verstehe, kann ich also eine Transaktion eröffnen,
    100 Änderungen am Schema machen (Tabellen erstellen, löschen, Trigger erstellen...)
    und dann entweder die Transaktion comitten (dann wären ALLE Änderungen durchgeführt) oder ein Rollback durchführen (wodurch alle Änderungen einfach verworfen werden)
    Ist das so korrekt?
    Zuletzt editiert von sspeedy; 14.06.2007, 10:18.

  • #2
    Hallo sspeedy,

    wie genau eine Datenbank Transaktionen implementiert hat ist wahrscheinlich sehr unterschiedlich.

    Was aber sichergestellt ist, ist die Tatsache, dass Du tatsächliche alle Möglichen Operationen in eine Transaktion packst, und diese dann entweder komplett oder gar nicht abgearbeitet wird.

    Eine Transaktion schlägt z.B. auch fehl, wenn folgendes Schulbeispiel z.B. eintrifft:
    - 2 Tabellen KontoA und KontoB
    - KontoA hat 1000 Euro als Spaltenwert
    - KontoB hat 400 Euro als Spaltenwert
    - folgende Transaktion: Überweisung 300 Euro von KontoA nach KontoB
    - ergibt Einzelschritte: ziehe 300 Euro von 100 Euro ab und Addiere 300 Euro auf 400 Euro
    - Wenn jetzt der erste Einzelschritt durchgeführt wird, und eine andere (völlig andere) Operation löscht KontoB (weil Kunde das so wollte), dann werden virtuell zunächst 300 Euro von KontoA abgezogen, bei der 2. Einzelaktion entsteht ein Fehler, und die 300 Euro Abzug werden verworfen -> Failed

    Das Ganze funktioniert auch so wie Du beschrieben hast mit Schema-Änderungen und auch Datenmanipualtionen.

    Mach Dir keinen Kopf wie das die Datenbank genau macht, das ist eine Wissenschaft für sich (Arbeiten mit Klonen oder Markern oder wie auch immer).

    Gewährleistet ist immer: Eine Transaktion wird immer komplett oder gar nicht abgearbeitet.

    Übrigens eine Transaktion kann auch von anderer Stelle her fehlschlagen, dann bekommst Du sie auch nicht ausgeführt (Wie Beispiel, wegen Kontoauflösung, die von einem anderen Bankschalter durchgeführt wird!).

    Viele Grüße
    _ntr_

    Comment


    • #3
      Ok, dann nehme ich es einfach hin, dass es funktioniert!
      Ist ja super, das erspart mir viel Arbeit

      Dankeschön!

      Comment

      Working...
      X