Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ten artykuł zawiera porady dotyczące implementowania transakcji i opracowywania rozwiązań w puli SQL.
Czego oczekiwać
Jak można się spodziewać, pula SQL obsługuje transakcje jako część obciążenia magazynu danych. Jednak w celu zapewnienia utrzymania puli SQL na dużą skalę niektóre funkcje są ograniczone w porównaniu z programem SQL Server. W tym artykule przedstawiono różnice.
Poziomy izolacji transakcji
Pula SQL implementuje transakcje ACID. Poziom izolacji obsługi transakcyjnej domyślnie wynosi ODCZYT NIEZATWIERDZONY. Można to zmienić na READ COMMITTED SNAPSHOT ISOLATION, włączając opcję READ_COMMITTED_SNAPSHOT dla puli SQL użytkownika po połączeniu z bazą danych master.
Po włączeniu wszystkie transakcje w tej bazie danych są wykonywane w poziomie izolacji dokumentu READ COMMITTED SNAPSHOT, a ustawienie poziomu izolacji ODCZYT NIEZATWIERDZONY na poziomie sesji nie zostanie uwzględnione. Aby uzyskać szczegółowe informacje, sprawdź ALTER DATABASE SET options (Transact-SQL).
Rozmiar transakcji
Jedna transakcja modyfikacji danych jest ograniczona w rozmiarze. Limit jest stosowany dla każdej dystrybucji. W związku z tym łączna alokacja może być obliczana przez pomnożenie limitu przez liczbę rozkładów.
Aby przybliżyć maksymalną liczbę wierszy w transakcji, podziel limit dystrybucji przez całkowity rozmiar każdego wiersza. W przypadku kolumn o zmiennej długości rozważ użycie średniej długości kolumny zamiast maksymalnego rozmiaru.
W poniższej tabeli dokonano dwóch założeń:
- Wystąpił równomierny rozkład danych
- Średnia długość wiersza to 250 bajtów
Druga generacja
| DWU | Limit na dystrybucję (GB) | Liczba dystrybucji | MAKSYMALNY rozmiar transakcji (GB) | Liczba wierszy w przeliczeniu na dystrybucję | Maksymalna liczba wierszy na transakcję |
|---|---|---|---|---|---|
| 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 | 4500 | 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 |
Generacja 1
| DWU | Limit na dystrybucję (GB) | Liczba dystrybucji | MAKSYMALNY rozmiar transakcji (GB) | Liczba wierszy na dystrybucję | Maksymalna liczba wierszy na transakcję |
|---|---|---|---|---|---|
| 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 |
Limit rozmiaru transakcji jest stosowany dla transakcji lub operacji. Nie jest ona stosowana we wszystkich równoczesnych transakcjach. W związku z tym każda transakcja może zapisywać tę ilość danych w dzienniku.
Aby zoptymalizować i zminimalizować ilość danych zapisanych w dzienniku, zapoznaj się z artykułem Transactions best practices (Najlepsze rozwiązania dotyczące transakcji ).
Ostrzeżenie
Maksymalny rozmiar transakcji można osiągnąć tylko dla tabel rozproszonych typu HASH lub ROUND_ROBIN, w których rozkład danych jest równomierny. Jeśli transakcja zapisuje dane w sposób nierównomierny w odniesieniu do dystrybucji, limit prawdopodobnie zostanie osiągnięty przed osiągnięciem maksymalnego rozmiaru transakcji.
Stan transakcji
Pula SQL używa funkcji XACT_STATE(), aby zgłosić nieudaną transakcję przy użyciu wartości -2. Ta wartość oznacza, że transakcja nie powiodła się i jest oznaczona tylko na potrzeby wycofywania.
Uwaga
Użycie -2 przez funkcję XACT_STATE w celu określenia nieudanej transakcji reprezentuje inne zachowanie programu SQL Server. Program SQL Server używa wartości -1 do reprezentowania transakcji niezatwierdzonych. Program SQL Server może tolerować niektóre błędy wewnątrz transakcji bez konieczności oznaczania ich jako niezatwierdzonych. Na przykład może spowodować błąd, SELECT 1/0 ale nie wymusić transakcji w stanie niezatwierdzonych.
Program SQL Server zezwala również na odczyty w transakcjach niezatwierdzalnych. Jednak pula SQL nie pozwala na to. Jeśli wystąpi błąd wewnątrz transakcji puli SQL, automatycznie przejdzie w stan -2 i nie będzie można wykonać żadnych dalszych zapytań SELECT, dopóki transakcja nie zostanie wycofana.
W związku z tym należy sprawdzić, czy kod aplikacji używa XACT_STATE(), ponieważ może być konieczne wprowadzenie modyfikacji kodu.
Na przykład w programie SQL Server może zostać wyświetlona transakcja, która wygląda następująco:
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;
Powyższy kod zawiera następujący komunikat o błędzie:
Msg 111233, poziom 16, stan 1, wiersz 1 111233; Bieżąca transakcja została anulowana, a wszystkie oczekujące zmiany zostały cofnięte. Przyczyną tego problemu jest to, że transakcja w stanie przeznaczonym tylko do wycofania nie zostaje jawnie wycofana przed wykonaniem instrukcji DDL, DML lub SELECT.
Nie uzyskasz danych wyjściowych funkcji ERROR_*.
W puli SQL kod musi zostać nieco zmieniony:
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;
Oczekiwane zachowanie jest teraz obserwowane. Błąd transakcji jest zarządzany, a funkcje ERROR_* zapewniają wartości zgodnie z oczekiwaniami.
Wszystko, co się zmieniło, to że wycofanie transakcji musiało nastąpić przed odczytaniem informacji o błędzie w bloku CATCH.
Error_Line(), funkcja
Warto również zauważyć, że pula SQL nie implementuje ani nie obsługuje funkcji ERROR_LINE(). Jeśli masz to w kodzie, musisz go usunąć, aby był zgodny z pulą SQL.
Użyj etykiet zapytań w kodzie, aby zaimplementować równoważne funkcje. Aby uzyskać więcej informacji, zobacz artykuł LABEL .
Używanie funkcji THROW i RAISERROR
THROW to bardziej nowoczesna implementacja do zgłaszania wyjątków w puli SQL, ale jest również obsługiwana funkcja RAISERROR. Istnieje kilka różnic, które warto jednak zwrócić uwagę.
- Liczba komunikatów o błędach zdefiniowanych przez użytkownika nie może mieścić się w zakresie od 100 000 do 150 000 dla funkcji THROW
- Komunikaty o błędach RAISERROR zostały naprawione na poziomie 50 000
- Korzystanie z pliku sys.messages nie jest obsługiwane
Ograniczenia
SQL Pool posiada pewne dodatkowe ograniczenia odnoszące się do transakcji.
Są one następujące:
- Brak transakcji rozproszonych
- Niedozwolone zagnieżdżone transakcje
- Brak dozwolonych punktów zapisywania
- Brak nazwanych transakcji
- Brak oznaczonych transakcji
- Brak obsługi języka DDL, takiego jak CREATE TABLE wewnątrz transakcji zdefiniowanej przez użytkownika
Następne kroki
Aby dowiedzieć się więcej na temat optymalizowania transakcji, zobacz Transactions best practices. Aby dowiedzieć się więcej o innych najlepszych rozwiązaniach dotyczących puli SQL, zobacz Najlepsze rozwiązania dotyczące puli SQL.