Megosztás:


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

Tippek a dedikált SQL-készlettel történő tranzakciók implementálására az Azure Synapse Analyticsben megoldások fejlesztéséhez.

Mire számítsunk?

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. Azonban annak biztosítása érdekében, hogy a dedikált SQL-készlet teljesítménye nagy méretekben maradjon fenn, bizonyos funkciók korlátozottak az SQL Serverhez képest. Ez a cikk kiemeli a különbségeket, és felsorolja a többieket.

Tranzakciós izolációs 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 értékre van beolvasva. Az OLVASÁSI KÖTELEZETT PILLANATFELVÉTEL ELSZIGETELÉS módosításához kapcsolja be a READ_COMMITTED_SNAPSHOT adatbázis beállítást egy felhasználói adatbázisnál, amikor csatlakozik a főadatbázishoz.

Amint engedélyezett, az adatbázis összes tranzakciója a READ COMMITTED SNAPSHOT ISOLATION alatt kerül végrehajtásra, és a munkameneti szinten a READ UNCOMMITTED beállítást figyelmen kívül hagyjuk. A részletekért tekintse meg az ALTER DATABASE SET beállításait (Transact-SQL).

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 úgy számítható ki, hogy megszorozza a korlátot az eloszlások számával.

A tranzakcióban lévő sorok maximális számának becsléséhez ossza el az eloszlási korlátot az egyes sorok teljes méretével. Változó hosszúságú oszlopok esetén fontolja meg az átlagos oszlophosszt a maximális méret használata helyett.

Az alábbi táblázatban a következő feltételezések történtek:

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

Gen2

DWU Eloszlásonkénti korlát (GB) Eloszlások száma MAX 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 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

Első Generáció

DWU Eloszlásonkénti korlát (GB) Eloszlások száma MAX 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át tranzakciónként vagy műveletenként lesz alkalmazva. Nem alkalmazzák az összes egyidejű tranzakcióra. Ezért minden tranzakció számára engedélyezett, hogy ennyi adatot írjon a naplóba.

A naplóba írt adatok 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 a tranzakció maximális mérete előtt lesz elérhető.

Tranzakció állapota

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

Megjegyzés

Az XACT_STATE függvény által a -2 használata sikertelen tranzakciók megjelölésére az SQL Server eltérő viselkedését jelenti. Az SQL Server a -1 értékkel jelöl egy nem véglegesíthető tranzakciót. Az SQL Server eltűrhet bizonyos hibákat egy tranzakcióban anélkül, hogy azt nem véglegesíthetőként kellene megjelölni. Például SELECT 1/0 hibát okozna, de nem kényszerítené a tranzakciót nem véglegesíthető állapotba. Az SQL Server a nem véglegesített tranzakcióban is engedélyezi az olvasást. A dedikált SQL-készlet azonban nem teszi lehetővé ezt. Ha egy dedikált SQL-készlet tranzakciója során hiba lép fel, az automatikusan beírja a -2 állapotot, és nem tud további kijelölési utasításokat végrehajtani, amíg az utasítás vissza nem kerül. Ezért fontos ellenőrizni, hogy az alkalmazás kódja XACT_STATE() használja-e, mivel lehetséges, hogy módosítania kell a kódokat.

Az SQL Serverben 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 minden függőben lévő módosítás vissza lett állítva. Ok: A csak visszaállítási állapotú tranzakciókat a rendszer nem fordította vissza explicit módon egy DDL, DML vagy SELECT utasítás előtt.

Nem fogja megkapni 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.

Minden, ami megváltozott, az, hogy a tranzakció visszaállításának a CATCH blokkban lévő hibainformációk beolvasá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és címkéket a hasonló funkciók megvalósításához. További információkért lásd a LABEL cikket.

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 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 vannak kijavítva
  • 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ó
  • Mentési pontok használata nem engedélyezett
  • Nincsenek elnevezett tranzakciók
  • Nincsenek megjelölt tranzakciók
  • Felhasználó által definiált tranzakción belül a DDL, például a CREATE TABLE, nem támogatott.

Következő lépések

A tranzakciók optimalizálásával kapcsolatos további információkért tekintse meg a tranzakciók ajánlott eljárásait. A dedikált SQL-készlethez és a kiszolgáló nélküli SQL-készlethez további ajánlott eljárásokra vonatkozó útmutatók is elérhetők.