Freigeben über


Verwenden von Transaktionen mit dediziertem SQL-Pool in Azure Synapse Analytics

Tipps zum Implementieren von Transaktionen mit dediziertem SQL-Pool in Azure Synapse Analytics für die Entwicklung von Lösungen.

Was dich erwartet

Wie Sie erwarten würden, unterstützt dedizierte SQL-Pool Transaktionen als Teil der Data Warehouse-Workload. Um jedoch sicherzustellen, dass die Leistung des dedizierten SQL-Pools im Großen und Umfang beibehalten wird, sind einige Features im Vergleich zu SQL Server eingeschränkt. In diesem Artikel werden die Unterschiede hervorgehoben und die anderen aufgeführt.

Transaktionsisolationsstufen

Dedizierter SQL-Pool implementiert ACID-Transaktionen. Die Isolationsebene der Transaktionsunterstützung ist standardmäßig auf READ UNCOMMITTED festgelegt. Sie können es in READ COMMITTED SNAPSHOT ISOLATION ändern, durch das Aktivieren der Datenbankoption READ_COMMITTED_SNAPSHOT für eine Benutzerdatenbank, wenn Sie mit der Masterdatenbank verbunden sind.

Nach der Aktivierung werden alle Transaktionen in dieser Datenbank unter READ COMMITTED SNAPSHOT ISOLATION ausgeführt, und das Festlegen von READ UNCOMMITTED auf Sitzungsebene wird nicht berücksichtigt. Details finden Sie unter ALTER DATABASE SET-Optionen (Transact-SQL ).

Transaktionsgröße

Eine einzelne Datenänderungstransaktion ist in der Größe begrenzt. Der Grenzwert wird pro Verteilung angewendet. Daher kann die Gesamtzuteilung durch Multiplizieren des Grenzwerts mit der Verteilungsanzahl berechnet werden.

Um die maximale Anzahl von Zeilen in der Transaktion anzunähern, dividieren Sie die Verteilungsgrenze durch die Gesamtgröße jeder Zeile. Bei Spalten mit variabler Länge sollten Sie eine durchschnittliche Spaltenlänge verwenden, anstatt die maximale Größe zu verwenden.

In der Tabelle unten sind die folgenden Annahmen gemacht worden:

  • Eine gleichmäßige Verteilung von Daten ist aufgetreten.
  • Die durchschnittliche Zeilenlänge beträgt 250 Bytes.

Gen2

DWU Obergrenze pro Verteilung (GB) Anzahl der Verteilungen MAX Transaktionsgröße (GB) # Zeilen pro Verteilung Max. Zeilen pro Transaktion
DW100c 1 60 60 4,000,000 240,000,000
DW200c 1.5 60 90 6,000,000 360.000.000
DW300c 2,25 60 135 9,000,000 540,000,000
DW400c 3 60 180 12,000,000 720,000,000
DW500c 3,75 60 225 15.000.000 900,000,000
DW1000c 7,5 60 450 30,000,000 1,800,000,000
DW1500c 11.25 60 675 45,000,000 2,700,000,000
DW2000c 15 60 900 60.000.000 3,600,000,000
DW2500c 18.75 60 1125 75,000,000 4,500,000,000
DW3000c 22,5 60 1,350 90.000.000 5,400,000,000
DW5000c 37,5 60 2,250 150,000,000 9,000,000,000
DW6000c 45 60 2.700 180,000,000 10,800,000,000
DW7500c 56.25 60 3,375 225,000,000 13,500,000,000
DW10000c 75 60 4\.500 300,000,000 18,000,000,000
DW15000c 112.5 60 6,750 450,000,000 27,000,000,000
DW30000c 225 60 13,500 900,000,000 54,000,000,000

Generation 1

DWU Obergrenze pro Verteilung (GB) Anzahl der Verteilungen MAX Transaktionsgröße (GB) # Zeilen pro Verteilung Max. Zeilen pro Transaktion
DW100 1 60 60 4,000,000 240,000,000
DW200 1.5 60 90 6,000,000 360.000.000
DW300 2,25 60 135 9,000,000 540,000,000
DW400 3 60 180 12,000,000 720,000,000
DW500 3,75 60 225 15.000.000 900,000,000
DW600 4.5 60 270 18.000.000 1,080,000,000
DW1000 7,5 60 450 30,000,000 1,800,000,000
DW1200 9 60 540 36.000.000 2,160,000,000
DW1500 11.25 60 675 45,000,000 2,700,000,000
DW2000 15 60 900 60.000.000 3,600,000,000
DW3000 22,5 60 1,350 90.000.000 5,400,000,000
DW6000 45 60 2.700 180,000,000 10,800,000,000

Die Transaktionsgrößenbeschränkung wird pro Transaktion oder Vorgang angewendet. Sie wird nicht für alle gleichzeitigen Transaktionen angewendet. Daher darf jede Transaktion diese Datenmenge in das Protokoll schreiben.

Informationen zum Optimieren und Minimieren der Datenmenge, die in das Protokoll geschrieben wurde, finden Sie im Artikel " Bewährte Methoden für Transaktionen ".

Warnung

Die maximale Transaktionsgröße kann nur für HASH- oder ROUND_ROBIN-verteilte Tabellen erreicht werden, wo die Verteilung der Daten gleichmäßig ist. Wenn die Transaktion Daten in schiefer Weise in die Verteilungen schreibt, wird die Grenze wahrscheinlich vor der maximalen Transaktionsgröße erreicht.

Transaktionsstatus

Der dedizierte SQL-Pool verwendet die funktion XACT_STATE() zum Melden einer fehlgeschlagenen Transaktion mit dem Wert -2. Dieser Wert bedeutet, dass die Transaktion fehlgeschlagen ist und nur für rollback markiert ist.

Hinweis

Die Verwendung von -2 durch die XACT_STATE-Funktion, um eine fehlgeschlagene Transaktion zu kennzeichnen, stellt ein anderes Verhalten für SQL Server dar. SQL Server verwendet den Wert -1, um eine nicht auskommentierbare Transaktion darzustellen. SQL Server kann einige Fehler innerhalb einer Transaktion tolerieren, ohne dass sie als nichtmittbar gekennzeichnet werden muss. Beispielsweise würde SELECT 1/0 einen Fehler verursachen, aber nicht eine Transaktion in einen nicht festschreibbaren Zustand versetzen. SQL Server erlaubt auch Lesevorgänge in einer nicht beständigen Transaktion. Der dedizierte SQL-Pool lässt dies jedoch nicht zu. Wenn innerhalb einer dedizierten SQL-Pooltransaktion ein Fehler auftritt, wird automatisch der -2 Zustand eingegeben, und Sie können keine weiteren Auswahlanweisungen vornehmen, bis die Anweisung zurückgesetzt wurde. Daher ist es wichtig zu überprüfen, ob Ihr Anwendungscode XACT_STATE() verwendet, da Sie möglicherweise Codeänderungen vornehmen müssen.

In SQL Server wird beispielsweise eine Transaktion angezeigt, die wie folgt aussieht:

SET NOCOUNT ON;
DECLARE @xact_state smallint = 0;

BEGIN TRAN
    BEGIN TRY
        DECLARE @i INT;
        SET     @i = CONVERT(INT,'ABC');
    END TRY
    BEGIN CATCH
        SET @xact_state = XACT_STATE();

        SELECT  ERROR_NUMBER()    AS ErrNumber
        ,       ERROR_SEVERITY()  AS ErrSeverity
        ,       ERROR_STATE()     AS ErrState
        ,       ERROR_PROCEDURE() AS ErrProcedure
        ,       ERROR_MESSAGE()   AS ErrMessage
        ;

        IF @@TRANCOUNT > 0
        BEGIN
            ROLLBACK TRAN;
            PRINT 'ROLLBACK';
        END

    END CATCH;

IF @@TRANCOUNT >0
BEGIN
    PRINT 'COMMIT';
    COMMIT TRAN;
END

SELECT @xact_state AS TransactionState;

Der vorangehende Code gibt die folgende Fehlermeldung an:

Msg 111233, Ebene 16, Zustand 1, Zeile 1 111233; Die aktuelle Transaktion wurde abgebrochen, und alle ausstehenden Änderungen wurden zurückgesetzt. Ursache: Eine Transaktion in einem Rollback-Only-Zustand wurde vor einer DDL-, DML- oder SELECT-Anweisung nicht explizit zurückgerollt.

Sie erhalten die Ausgabe der ERROR_*-Funktionen nicht.

Im dedizierten SQL-Pool muss der Code leicht geändert werden:

SET NOCOUNT ON;
DECLARE @xact_state smallint = 0;

BEGIN TRAN
    BEGIN TRY
        DECLARE @i INT;
        SET     @i = CONVERT(INT,'ABC');
    END TRY
    BEGIN CATCH
        SET @xact_state = XACT_STATE();

        IF @@TRANCOUNT > 0
        BEGIN
            ROLLBACK TRAN;
            PRINT 'ROLLBACK';
        END

        SELECT  ERROR_NUMBER()    AS ErrNumber
        ,       ERROR_SEVERITY()  AS ErrSeverity
        ,       ERROR_STATE()     AS ErrState
        ,       ERROR_PROCEDURE() AS ErrProcedure
        ,       ERROR_MESSAGE()   AS ErrMessage
        ;
    END CATCH;

IF @@TRANCOUNT >0
BEGIN
    PRINT 'COMMIT';
    COMMIT TRAN;
END

SELECT @xact_state AS TransactionState;

Das erwartete Verhalten wird jetzt beobachtet. Der Fehler in der Transaktion wird verwaltet, und die funktionen ERROR_* stellen Werte wie erwartet bereit.

Alles, was sich geändert hat, ist, dass das ROLLBACK der Transaktion vor dem Auslesen der Fehlerinformationen im CATCH-Block erfolgen musste.

Error_Line()-Funktion

Beachten Sie auch, dass der dedizierte SQL-Pool die funktion ERROR_LINE() nicht implementiert oder unterstützt. Wenn Sie diese Funktion in Ihrem Code haben, müssen Sie sie entfernen, damit sie mit dediziertem SQL-Pool kompatibel ist. Verwenden Sie stattdessen Abfragebeschriftungen in Ihrem Code, um gleichwertige Funktionen zu implementieren. Weitere Informationen finden Sie im LABEL-Artikel .

Verwendung von THROW und RAISERROR

THROW ist die modernere Implementierung zum Auslösen von Ausnahmen im dedizierten SQL-Pool, aber RAISERROR wird ebenfalls unterstützt. Es gibt jedoch einige Unterschiede, die es wert sind, die Aufmerksamkeit zu schenken.

  • Benutzerdefinierte Fehlermeldungen können sich nicht im Bereich von 100.000 - 150.000 für THROW befinden.
  • RAISERROR-Fehlermeldungen sind auf 50.000 festgelegt.
  • Die Verwendung von sys.messages wird nicht unterstützt.

Einschränkungen

Dedizierter SQL-Pool hat einige andere Einschränkungen, die sich auf Transaktionen beziehen. Sie sind wie folgt:

  • Keine verteilten Transaktionen
  • Keine geschachtelten Transaktionen zulässig
  • Keine Speicherpunkte zulässig
  • Keine benannten Transaktionen
  • Keine markierten Transaktionen
  • Keine Unterstützung für DDL wie CREATE TABLE in einer benutzerdefinierten Transaktion

Nächste Schritte

Weitere Informationen zum Optimieren von Transaktionen finden Sie unter "Bewährte Methoden für Transaktionen". Weitere Anleitungen zu bewährten Methoden werden auch für dedizierten SQL-Pool und serverlosen SQL-Pool bereitgestellt.