Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - Programmierung » SQL Anywhere Datenzugriff-APIs » SQL Anywhere .NET-Datenprovider

 

Transaktionsverarbeitung

Mit dem SQL Anywhere .NET-Datenprovider können Sie das SATransaction-Objekt verwenden, um Anweisungen zu gruppieren. Jede Transaktion endet mit COMMIT oder ROLLBACK, sodass Ihre Änderungen in der Datenbank festgeschrieben oder alle Vorgänge in der Transaktion zurückgesetzt werden. Wenn die Transaktion abgeschlossen ist, müssen Sie ein neues SATransaction-Objekt erstellen, um weitere Änderungen durchzuführen. Dieses Verhalten ist anders als bei ODBC und Embedded SQL, wo eine Transaktion, nachdem Sie eine COMMIT- oder ROLLBACK-Anweisung ausgeführt haben, bestehen bleibt, bis die Transaktion geschlossen wird.

Wenn Sie keine Transaktion erstellen, arbeitet der SQL Anywhere .NET-Datenprovider standardmäßig im Autocommit-Modus. Nach jeder Insert-, Update- oder Delete-Anweisung wird ein implizites COMMIT gesetzt, und wenn ein Vorgang abgeschlossen ist, wird die Änderung in der Datenbank durchgeführt. In diesem Fall können die Änderungen nicht zurückgesetzt werden.

Weitere Hinweise zum SATransaction-Objekt finden Sie im Abschnitt SATransaction-Klasse.

Isolationsstufe für Transaktionen setzen

Die Datenbank-Isolationsstufe wird standardmäßig für Transaktionen verwendet. Sie können allerdings die Isolationsstufe für eine Transaktion mit der IsolationLevel-Eigenschaft definieren, wenn Sie die Transaktion beginnen. Die Isolationsstufe gilt für alle Anweisungen, die innerhalb der Transaktion ausgeführt werden. Der SQL Anywhere .NET-Datenprovider unterstützt die Snapshot-Isolation.

Weitere Hinweise zu Isolationsstufen finden Sie unter Isolationsstufen und Konsistenz.

Welche Sperren SQL Anywhere benutzt, wenn Sie eine Select-Anweisung ausführen, hängt von der Isolationsstufe der Transaktion ab.

Weitere Hinweise zu Sperren und Isolationsstufen finden Sie unter Sperren bei Abfragen.

Im nachstehenden Beispiel wird ein SATransaction-Objekt verwendet, um eine SQL-Anweisung einzugeben und danach zurückzusetzen. Die Transaktion benutzt Isolationsstufe 2 (RepeatableRead), wobei eine Schreibsperre auf die zu ändernde Zeile gesetzt wird, damit kein anderer Datenbankbenutzer die Zeile aktualisieren kann.

♦  So führen Sie mit dem SATransaction-Objekt eine Anweisung aus
  1. Deklarieren und initialisieren Sie ein SAConnection-Objekt.

    SAConnection conn = new SAConnection(
        "Data Source=SQL Anywhere 11 Demo" );
  2. Öffnen Sie die Verbindung.

    conn.Open();
  3. Geben Sie eine SQL-Anweisung ein, um den Preis der Tee-Shirts zu ändern.

    string stmt = "UPDATE Products SET UnitPrice =
        2000.00 WHERE name = 'Tee shirt'";
  4. Erstellen Sie ein SATransaction-Objekt, um die SQL-Anweisung mit einem Command-Objekt auszuführen.

    Mit einer Transaktion können Sie die Isolationsstufe festlegen. Isolationsstufe 2 (RepeatableRead ) wird in diesem Beispiel benutzt, damit ein anderer Datenbankbenutzer die Zeile nicht aktualisieren kann.

    SATransaction trans = conn.BeginTransaction(
        IsolationLevel.RepeatableRead );
    SACommand cmd = new SACommand( stmt, conn,
        trans );
    int rows = cmd.ExecuteNonQuery();
  5. Setzen Sie die Änderungen zurück.

    trans.Rollback();

    Mit dem SATransaction-Objekt können Sie Ihre Änderungen in der Datenbank festschreiben oder zurücksetzen. Wenn Sie keine Transaktion verwenden, funktioniert der .NET-Datenprovider im Autocommit-Modus und Sie können Änderungen, die Sie in der Datenbank durchgeführt haben, nicht mehr zurücksetzen. Wenn Sie die Änderungen dauerhaft festschreiben möchten, verwenden Sie folgende Schreibweise:

    trans.Commit();
  6. Schließen Sie das SAConnection-Objekt.

    conn.Close();
Verteilte Transaktionsverarbeitung

In .NET Framework 2.0 wurde der neue Namespace System.Transactions eingeführt, der Klassen zur Erstellung transaktionaler Anwendungen enthält. Clientanwendungen können verteilte Transaktionen mit einem oder mehreren Teilnehmern erstellen und an diesen beteiligt sein. Clientanwendungen können mit der Klasse TransactionScope implizit Transaktionen erstellen. Das Verbindungsobjekt kann feststellen, ob eine von TransactionScope erstellte Umgebungstransaktion vorhanden ist und diese automatisch auflisten. Clientanwendungen können auch mit CommittableTransaction eine festschreibbare Transaktion erstellen und die Methode EnlistTransaction aufrufen, um sie aufzulisten. Diese Funktion wird vom SQL Anywhere .NET 2.0-Datenprovider unterstützt. Verteilte Transaktionen haben einen erheblichen Performance-Overhead. Es wird empfohlen, für nicht verteilte Transaktionen Datenbanktransaktionen zu verwenden.