Tranzakciók használata SQL-készletben a Azure Synapse

Ez a cikk tippeket tartalmaz a tranzakciók implementálásához és az SQL-készletben található megoldások fejlesztéséhez.

Amire számíthat

Ahogy várható volt, az SQL-készlet az adattárház számítási feladatainak részeként támogatja a tranzakciókat. Annak biztosítása érdekében azonban, hogy az SQL-készlet nagy léptékben legyen karbantartva, bizonyos funkciók korlátozottak a SQL Server képest. Ez a cikk a különbségeket emeli ki.

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

Az 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 UNCOMMITTED OLVASÁSA. 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 SQL-készlet READ_COMMITTED_SNAPSHOT adatbázisbeállítását, amikor csatlakozik a főadatbázishoz.

Ha engedélyezve van, az adatbázis összes tranzakciója a READ COMMITTED SNAPSHOT ISOLATION (OLVASÁSI VÉGLEGES PILLANATKÉP ELKÜLÖNÍTÉSE) területen lesz végrehajtva, és a munkamenet szintjén a READ UNCOMMITTED 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. Ezért a teljes foglalás a korlát és az eloszlásszám megszorzásá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. Változó hosszúságú oszlopok esetében fontolja meg az átlagos oszlophosszt a maximális méret használata helyett.

A következő táblázatban két feltételezés történt:

  • 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ásait ismertető cikket.

Figyelmeztetés

A maximális tranzakcióméret 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 maximális tranzakcióméret előtt valószínűleg eléri a korlátot.

Tranzakció állapota

Az SQL-készlet a XACT_STATE() függvénnyel jelent egy sikertelen 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 XACT_STATE függvény általi használata a sikertelen tranzakciók jelölésére a SQL Server eltérő viselkedést képvisel. SQL Server a -1 értéket használja egy nem véglegesíthető tranzakció ábrázolásához. SQL Server eltűrhet bizonyos hibákat egy tranzakcióban anélkül, hogy azt nem javasoltként kellene megjelölni. Például hibát okozna, SELECT 1/0 de nem kényszerítene ki egy tranzakciót nem véglegesíthető állapotba.

SQL Server a nem véglegesíthető tranzakcióban is engedélyezi az olvasást. Az SQL-készlet azonban nem teszi lehetővé ezt. Ha hiba történik egy SQL-készlet tranzakciójában, az automatikusan megadja a -2 állapotot, é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ál-e, mivel előfordulhat, hogy módosításokat kell végeznie a kódon.

A SQL Server például az alábbihoz 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. Ennek a problémának az az oka, hogy egy csak visszaállítási állapotú tranzakciót a rendszer nem vet vissza explicit módon egy DDL, DML vagy SELECT utasítás előtt.

A ERROR_* függvények kimenete nem lesz lekérve.

Az 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 rendszer kezeli a tranzakció hibáját, és a ERROR_* függvények a várt értékeket adják meg.

Csak az változott meg, 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 az SQL-készlet nem implementálja vagy támogatja a ERROR_LINE() függvényt. Ha ez szerepel a kódban, el kell távolítania, hogy megfeleljen az SQL-készletnek.

Használjon lekérdezésfeliratokat a kódban az egyenértékű funkciók implementálásához. További részletekért tekintse meg a LABEL (CÍMKE ) című cikket.

A THROW és a RAISERROR használata

A THROW az 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 vannak kijavítva
  • A sys.messages használata nem támogatott

Korlátozások

Az SQL-készletnek van néhány egyéb, a tranzakciókra vonatkozó 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 felhasználó által definiált tranzakción belül

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. Az SQL-készlet egyéb ajánlott eljárásaival kapcsolatban lásd az SQL-készlet ajánlott eljárásait ismertető cikket.