Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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.