Tranzakciók használata dedikált SQL-készlettel a Azure Synapse Analyticsben

Tippek a tranzakciók dedikált SQL-készlettel való implementálására a Azure Synapse Analyticsben megoldások fejlesztéséhez.

Amire számíthat

Ahogy várható volt, a dedikált SQL-készlet támogatja a tranzakciókat az adattárház számítási feladatainak részeként. A dedikált SQL-készlet teljesítményének fenntartása érdekében azonban bizonyos funkciók korlátozottak a SQL Server képest. Ez a cikk kiemeli a különbségeket, és felsorolja a többit.

Tranzakcióelkülönítési szintek

A dedikált SQL-készlet ACID-tranzakciókat valósít meg. A tranzakciós támogatás elkülönítési szintje alapértelmezés szerint a READ UNCOMMITTED (KI NEM OLVASOTT) értékre van kapcsolva. A VÉGLEGESÍTETT PILLANATKÉP-ELKÜLÖNÍTÉS OLVASÁSA beállításra módosíthatja, ha bekapcsolja a felhasználói adatbázis READ_COMMITTED_SNAPSHOT adatbázisbeállítását, amikor csatlakozik a master adatbázishoz.

Ha engedélyezve van, az adatbázis összes tranzakciója a READ COMMITTED SNAPSHOT ISOLATION (LEKÖTÖTT PILLANATKÉP ELKÜLÖNÍTÉSE) területen lesz végrehajtva, és a munkamenet szintjén a READ UNCOMMITTED (OLVASÁSI KIKÖTÉS NÉLKÜL) beállítás nem lesz betartva. A részletekért tekintse meg az ALTER DATABASE SET (Transact-SQL) beállításokat .

Tranzakció mérete

Egyetlen adatmódosítási tranzakció mérete korlátozott. A korlát eloszlásonként van alkalmazva. Így a teljes kiosztás a korlát és az eloszlásszám szorzatával számítható ki.

A tranzakcióban lévő sorok maximális számának közelítéséhez ossza el az eloszlási korlátot az egyes sorok teljes méretével. A változó hosszúságú oszlopok esetében fontolja meg egy átlagos oszlophossz használatát a maximális méret használata helyett.

Az alábbi táblázatban a következő feltételezések teljesültek:

  • Egyenletes adateloszlás történt
  • Az átlagos sorhossz 250 bájt

Gen2

DWU Eloszlásonkénti korlát (GB) Eloszlások száma MAXIMÁLIS tranzakcióméret (GB) # Sorok eloszlásonként Sorok maximális száma tranzakciónként
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 lehetőséget 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 6750 450,000,000 27,000,000,000
DW30000c 225 60 13,500 900,000,000 54,000,000,000

Gen1

DWU Eloszlásonkénti korlát (GB) Eloszlások száma MAXIMÁLIS tranzakcióméret (GB) # Sorok eloszlásonként Sorok maximális száma tranzakciónként
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

A tranzakció méretkorlátja tranzakciónként vagy műveletenként lesz alkalmazva. A rendszer nem alkalmazza az összes egyidejű tranzakcióra. Ezért minden tranzakció írhat ilyen mennyiségű adatot a naplóba.

A naplóba írt adatok mennyiségének optimalizálásához és minimalizálásához tekintse meg a Tranzakciók ajánlott eljárások című cikket.

Figyelmeztetés

A tranzakció maximális mérete csak a HASH vagy ROUND_ROBIN elosztott táblák esetében érhető el, ahol az adatok eloszlása egyenletes. Ha a tranzakció ferde módon ír adatokat a disztribúciókba, akkor a korlát valószínűleg eléri a tranzakció maximális méretét.

Tranzakció állapota

A dedikált SQL-készlet a XACT_STATE() függvénnyel jelent egy meghiúsult tranzakciót a -2 érték használatával. Ez az érték azt jelenti, hogy a tranzakció meghiúsult, és csak visszaállításra van megjelölve.

Megjegyzés

A -2 használata a XACT_STATE függvény által a sikertelen tranzakciók jelölésére a SQL Server eltérő viselkedését jelenti. SQL Server a -1 értéket használja egy nem véglegesíthető tranzakció megjelenítéséhez. SQL Server eltűrhet bizonyos hibákat egy tranzakcióban anélkül, hogy azt nem véglegesnek kellene jelölnie. Például SELECT 1/0 hibát okozna, de nem kényszerítené a tranzakciót egy nem végleges állapotba. SQL Server olvasást is engedélyez a nem véglegesíthető tranzakcióban. A dedikált SQL-készlet azonban nem teszi lehetővé ezt. Ha hiba történik egy dedikált SQL-készlet tranzakciójában, az automatikusan a -2 állapotot adja meg, és a utasítás visszaállításáig nem tud további kijelölési utasításokat végrehajtani. Ezért fontos ellenőrizni, hogy az alkalmazáskód XACT_STATE() használja-e, mivel előfordulhat, hogy módosítania kell a kódokat.

A SQL Server például a következőhöz hasonló tranzakció jelenhet meg:

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;

Az előző kód a következő hibaüzenetet adja:

Msg 111233, Level 16, State 1, Line 1 111233; Az aktuális tranzakció megszakadt, és a függőben lévő módosítások vissza lettek vonva. Ok: A csak visszaállítási állapotú tranzakciókat nem vonták vissza explicit módon egy DDL, DML vagy SELECT utasítás előtt.

Nem kapja meg a ERROR_* függvény kimenetét.

A dedikált SQL-készletben a kódot kissé módosítani kell:

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;

A várt viselkedés most már megfigyelhető. A tranzakció hibáját a rendszer kezeli, és a ERROR_* függvények a várt módon adják meg az értékeket.

Ami megváltozott, az az, hogy a tranzakció ROLLBACK-jének a CATCH blokk hibainformációinak olvasása előtt kellett történnie.

Error_Line() függvény

Azt is érdemes megjegyezni, hogy a dedikált SQL-készlet nem implementálja vagy támogatja a ERROR_LINE() függvényt. Ha ez a függvény szerepel a kódban, el kell távolítania, hogy megfeleljen a dedikált SQL-készletnek. A kódban használjon lekérdezéscímkéket a megfelelő funkciók implementálásához. További információt a LABEL (CÍMKE ) című cikkben talál.

A THROW és a RAISERROR használata

A THROW a dedikált SQL-készlet kivételeinek emelésére szolgáló modernebb implementáció, de a RAISERROR is támogatott. Van azonban néhány különbség, amelyekre érdemes figyelmet fordítani.

  • A felhasználó által megadott hibaüzenetek száma nem lehet a THROW 100 000 – 150 000 tartományában
  • A RAISERROR hibaüzenetek 50 000-nél javítva vannak
  • A sys.messages használata nem támogatott

Korlátozások

A dedikált SQL-készletnek van néhány egyéb, a tranzakciókhoz kapcsolódó korlátozása. Ezek a következők:

  • Nincsenek elosztott tranzakciók
  • Nincs engedélyezett beágyazott tranzakció
  • Nem engedélyezett mentési pontok
  • Nincsenek elnevezett tranzakciók
  • Nincsenek megjelölt tranzakciók
  • A DDL nem támogatott, például a CREATE TABLE egy felhasználó által definiált tranzakcióban

Következő lépések

A tranzakciók optimalizálásával kapcsolatos további információkért lásd: Tranzakciók – ajánlott eljárások. A dedikált SQL-készlethez és a kiszolgáló nélküli SQL-készlethez további ajánlott eljárásokkal kapcsolatos útmutatók is elérhetők.