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.