Freigeben über


Gleichzeitigkeitssteuerung

Parallelität ist die Fähigkeit von zwei Transaktionen, die gleichen Daten gleichzeitig zu verwenden, und mit erhöhter Transaktionsisolation kommt in der Regel eine reduzierte Parallelität. Dies liegt daran, dass die Transaktionsisolation in der Regel durch Sperren von Zeilen implementiert wird, und da mehr Zeilen gesperrt sind, können weniger Transaktionen abgeschlossen werden, ohne zumindest vorübergehend durch eine gesperrte Zeile blockiert zu werden. Während eine reduzierte Parallelität in der Regel als Kompromiss für die höheren Transaktionsisolationsstufen akzeptiert wird, die erforderlich sind, um die Datenbankintegrität zu Standard, kann es zu einem Problem in interaktiven Anwendungen mit hoher Lese-/Schreibaktivität werden, die Cursor verwenden.

Angenommen, eine Anwendung führt die SQL-Anweisung SELECT * FROM Orders aus. Es ruft SQLFetchScroll auf, um den Resultset zu scrollen und dem Benutzer das Aktualisieren, Löschen oder Einfügen von Aufträgen zu ermöglichen. Nachdem der Benutzer eine Bestellung aktualisiert, gelöscht oder eingefügt hat, wird die Transaktion von der Anwendung ausgeführt.

Wenn die Isolationsebene wiederholbar gelesen wird, kann die Transaktion – je nachdem, wie sie implementiert wird – jede Zeile sperren, die von SQLFetchScroll zurückgegeben wird. Wenn die Isolationsebene serialisierbar ist, kann die Transaktion die gesamte Orders-Tabelle sperren. In beiden Fällen gibt die Transaktion ihre Sperren nur dann frei, wenn sie zugesichert oder zurückgesetzt wird. Wenn der Benutzer also viel Zeit mit dem Lesen von Bestellungen und sehr wenig Zeit beim Aktualisieren, Löschen oder Einfügen verbringt, könnte die Transaktion eine große Anzahl von Zeilen problemlos sperren, sodass sie für andere Benutzer nicht verfügbar sind.

Dies ist ein Problem, auch wenn der Cursor schreibgeschützt ist und die Anwendung es dem Benutzer ermöglicht, nur vorhandene Bestellungen zu lesen. In diesem Fall commits die Anwendung die Transaktion und gibt Sperrungen frei, wenn sie SQLCloseCursor (im Auto-Commit-Modus) oder SQLEndTran (im manuellen Commit-Modus) aufruft.

In diesem Abschnitt werden die folgenden Themen behandelt: