Wiosna - zarządzanie transakcjami
Transakcja bazy danych to sekwencja działań, które są traktowane jako pojedyncza jednostka pracy. Działania te powinny albo zakończyć się całkowicie, albo nie przynieść żadnego efektu. Zarządzanie transakcjami jest ważną częścią aplikacji korporacyjnej zorientowanej na RDBMS w celu zapewnienia integralności i spójności danych. Pojęcie transakcji można opisać za pomocą następujących czterech kluczowych właściwości opisanych jakoACID -
Atomicity - Transakcję należy traktować jako pojedynczą jednostkę operacji, co oznacza, że cała sekwencja operacji zakończyła się sukcesem lub niepowodzeniem.
Consistency - Reprezentuje spójność referencyjną integralności bazy danych, unikalne klucze podstawowe w tabelach itp.
Isolation- W tym samym czasie może być przetwarzanych wiele transakcji z tym samym zestawem danych. Każda transakcja powinna być odizolowana od innych, aby zapobiec uszkodzeniu danych.
Durability - Po zakończeniu transakcji wyniki tej transakcji muszą być trwałe i nie mogą zostać usunięte z bazy danych z powodu awarii systemu.
Prawdziwy system baz danych RDBMS gwarantuje wszystkie cztery właściwości dla każdej transakcji. Uproszczony widok transakcji wysłanej do bazy danych za pomocą SQL jest następujący:
Rozpocznij transakcję za pomocą polecenia begin transaction .
Wykonuj różne operacje usuwania, aktualizacji lub wstawiania za pomocą zapytań SQL.
Jeśli wszystkie operacje zakończą się pomyślnie, wykonaj zatwierdzenie, w przeciwnym razie wycofaj wszystkie operacje.
Struktura Spring zapewnia abstrakcyjną warstwę na wierzchu różnych podstawowych interfejsów API do zarządzania transakcjami. Obsługa transakcji Springa ma na celu zapewnienie alternatywy dla transakcji EJB poprzez dodanie możliwości transakcyjnych do POJO. Spring obsługuje zarówno programowe, jak i deklaratywne zarządzanie transakcjami. EJB wymagają serwera aplikacji, ale zarządzanie transakcjami Spring można zaimplementować bez potrzeby serwera aplikacji.
Transakcje lokalne a transakcje globalne
Transakcje lokalne są specyficzne dla pojedynczego zasobu transakcyjnego, takiego jak połączenie JDBC, podczas gdy transakcje globalne mogą obejmować wiele zasobów transakcyjnych, takich jak transakcje w systemie rozproszonym.
Lokalne zarządzanie transakcjami może być przydatne w scentralizowanym środowisku komputerowym, w którym składniki aplikacji i zasoby znajdują się w jednym miejscu, a zarządzanie transakcjami obejmuje tylko lokalnego menedżera danych działającego na jednym komputerze. Transakcje lokalne są łatwiejsze do wdrożenia.
Globalne zarządzanie transakcjami jest wymagane w rozproszonym środowisku komputerowym, w którym wszystkie zasoby są rozproszone w wielu systemach. W takim przypadku zarządzanie transakcjami musi odbywać się zarówno na poziomie lokalnym, jak i globalnym. Transakcja rozproszona lub globalna jest wykonywana w wielu systemach, a jej wykonanie wymaga koordynacji między globalnym systemem zarządzania transakcjami a wszystkimi lokalnymi menedżerami danych wszystkich zaangażowanych systemów.
Programowe a deklaratywne
Spring obsługuje dwa rodzaje zarządzania transakcjami -
Automatyzacja zarządzania transakcjami - Oznacza to, że musisz zarządzać transakcją za pomocą programowania. Zapewnia to wyjątkową elastyczność, ale jest trudna do utrzymania.
Deklaratywne zarządzanie transakcjami - oznacza to oddzielenie zarządzania transakcjami od kodu biznesowego. Do zarządzania transakcjami używa się tylko adnotacji lub konfiguracji opartej na języku XML.
Deklaratywne zarządzanie transakcjami jest lepsze niż zautomatyzowane zarządzanie transakcjami, chociaż jest mniej elastyczne niż zautomatyzowane zarządzanie transakcjami, które pozwala kontrolować transakcje za pomocą kodu. Ale jako rodzaj problemu przekrojowego, deklaratywne zarządzanie transakcjami można modularyzować za pomocą podejścia AOP. Spring obsługuje deklaratywne zarządzanie transakcjami za pośrednictwem struktury Spring AOP.
Wiosenne abstrakcje transakcji
Klucz do abstrakcji transakcji Spring jest zdefiniowany przez interfejs org.springframework.transaction.PlatformTransactionManager , który wygląda następująco -
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition);
throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
Sr.No | Metoda i opis |
---|---|
1 | TransactionStatus getTransaction(TransactionDefinition definition) Ta metoda zwraca aktualnie aktywną transakcję lub tworzy nową, zgodnie z określonym zachowaniem propagacji. |
2 | void commit(TransactionStatus status) Metoda ta zatwierdza daną transakcję ze względu na jej status. |
3 | void rollback(TransactionStatus status) Ta metoda wykonuje wycofanie danej transakcji. |
TransactionDefinition jest interfejs rdzeń obsługi transakcji na wiosnę i jest zdefiniowany w następujący sposób -
public interface TransactionDefinition {
int getPropagationBehavior();
int getIsolationLevel();
String getName();
int getTimeout();
boolean isReadOnly();
}
Sr.No | Metoda i opis |
---|---|
1 | int getPropagationBehavior() Ta metoda zwraca zachowanie propagacji. Spring oferuje wszystkie opcje propagacji transakcji znane z EJB CMT. |
2 | int getIsolationLevel() Ta metoda zwraca stopień, w jakim transakcja jest odizolowana od innych transakcji. |
3 | String getName() Ta metoda zwraca nazwę tej transakcji. |
4 | int getTimeout() Ta metoda zwraca czas w sekundach, w którym transakcja musi zostać zakończona. |
5 | boolean isReadOnly() Ta metoda zwraca, czy transakcja jest tylko do odczytu. |
Poniżej przedstawiono możliwe wartości poziomu izolacji -
Sr.No | Izolacja i opis |
---|---|
1 | TransactionDefinition.ISOLATION_DEFAULT To jest domyślny poziom izolacji. |
2 | TransactionDefinition.ISOLATION_READ_COMMITTED Wskazuje, że zapobiega się zabrudzonym odczytom; mogą wystąpić odczyty niepowtarzalne i odczyty fantomowe. |
3 | TransactionDefinition.ISOLATION_READ_UNCOMMITTED Wskazuje, że mogą wystąpić brudne odczyty, niepowtarzalne odczyty i odczyty pozorne. |
4 | TransactionDefinition.ISOLATION_REPEATABLE_READ Wskazuje, że zapobiega się zabrudzonym odczytom i niepowtarzalnym odczytom; mogą wystąpić odczyty fantomowe. |
5 | TransactionDefinition.ISOLATION_SERIALIZABLE Wskazuje, że zapobiega się zabrudzonym odczytom, niepowtarzalnym odczytom i odczytom fantomowym. |
Poniżej przedstawiono możliwe wartości typów propagacji -
Sr.No. | Propagacja i opis |
---|---|
1 | TransactionDefinition.PROPAGATION_MANDATORY Obsługuje bieżącą transakcję; zgłasza wyjątek, jeśli nie istnieje żadna bieżąca transakcja. |
2 | TransactionDefinition.PROPAGATION_NESTED Wykonywany w ramach transakcji zagnieżdżonej, jeśli istnieje bieżąca transakcja. |
3 | TransactionDefinition.PROPAGATION_NEVER Nie obsługuje bieżącej transakcji; zgłasza wyjątek, jeśli istnieje bieżąca transakcja. |
4 | TransactionDefinition.PROPAGATION_NOT_SUPPORTED Nie obsługuje bieżącej transakcji; raczej zawsze wykonywane nietransakcyjnie. |
5 | TransactionDefinition.PROPAGATION_REQUIRED Obsługuje bieżącą transakcję; tworzy nowy, jeśli taki nie istnieje. |
6 | TransactionDefinition.PROPAGATION_REQUIRES_NEW Tworzy nową transakcję, zawieszając bieżącą transakcję, jeśli taka istnieje. |
7 | TransactionDefinition.PROPAGATION_SUPPORTS Obsługuje bieżącą transakcję; jest wykonywany bez transakcji, jeśli nie istnieje. |
8 | TransactionDefinition.TIMEOUT_DEFAULT Używa domyślnego limitu czasu podstawowego systemu transakcyjnego lub żadnego, jeśli limity czasu nie są obsługiwane. |
TransactionStatus interfejs zapewnia prostą drogę do kodu transakcyjnego do realizacji transakcji i zapytań kontrola statusu transakcji.
public interface TransactionStatus extends SavepointManager {
boolean isNewTransaction();
boolean hasSavepoint();
void setRollbackOnly();
boolean isRollbackOnly();
boolean isCompleted();
}
Sr.No. | Metoda i opis |
---|---|
1 | boolean hasSavepoint() Ta metoda zwraca, czy transakcja wewnętrznie przenosi punkt zapisu, tj. Została utworzona jako transakcja zagnieżdżona na podstawie punktu zapisu. |
2 | boolean isCompleted() Ta metoda zwraca informację, czy transakcja została zakończona, tj. Czy została już zatwierdzona, czy wycofana. |
3 | boolean isNewTransaction() Ta metoda zwraca wartość true w przypadku, gdy obecna transakcja jest nowa. |
4 | boolean isRollbackOnly() Ta metoda zwraca, czy transakcja została oznaczona jako tylko wycofywanie. |
5 | void setRollbackOnly() Ta metoda ustawia transakcję jako tylko wycofywanie. |