Megosztás a következőn keresztül:


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

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

Mire számítsunk?

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

Tranzakciós izolációs szintek

Az SQL-készlet ACID-tranzakciókat implementál. A tranzakciós támogatás elkülönítési szintje alapértelmezés szerint a READ UNCOMMITTED értékre van beolvasva. Ha a fő adatbázishoz csatlakozik, módosíthatja a VÉGLEGESÍTETT PILLANATKÉP-ELKÜLÖNÍTÉS OLVASÁSA beállítást a felhasználói SQL-készlet READ_COMMITTED_SNAPSHOT adatbázis-beállításának bekapcsolásával.

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 beállítás nem lesz betartva. 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. Ezért a teljes kiosztás úgy számítható ki, hogy megszorozza a korlátot az eloszlásszá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.

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 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 elosztá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

Az SQL-készlet a XACT_STATE() függvény segítségével jelenti a sikertelen tranzakciót a -2-es é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

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 hibát okozna, SELECT 1/0 de nem kényszerítene egy tranzakciót nem véglegesíthető állapotba.

Az SQL Server a nem véglegesített tranzakcióban is engedélyezi az olvasást. Az SQL-készlet azonban nem teszi lehetővé ezt. Ha egy SQL-készlettranzakcióban hiba történik, 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. A probléma oka az, hogy a csak visszaállítási állapotú tranzakciók nem kerülnek explicit módon vissza a DDL, DML vagy SELECT utasítás elé.

Nem fogja megkapni a ERROR_* függvény kimenetét.

Az SQL poolban 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 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 tár követelményeinek.

A kódban használjon lekérdezésfeliratokat a megfelelő funkciók implementálásához. További részletekért lásd a LABEL 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 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ó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. Az SQL-készlet egyéb ajánlott eljárásainak megismeréséhez tekintse meg az SQL-készlet ajánlott eljárásait.