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.
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: