JDBC - Transakcje

Jeśli połączenie JDBC jest w trybie automatycznego zatwierdzania , którym jest domyślnie, każda instrukcja SQL jest zatwierdzana w bazie danych po jej zakończeniu.

To może być dobre w przypadku prostych aplikacji, ale istnieją trzy powody, dla których możesz chcieć wyłączyć automatyczne zatwierdzanie i zarządzać własnymi transakcjami -

  • Aby zwiększyć wydajność.

  • Aby zachować integralność procesów biznesowych.

  • Aby korzystać z transakcji rozproszonych.

Transakcje umożliwiają kontrolowanie, czy i kiedy zmiany są stosowane w bazie danych. Traktuje pojedynczą instrukcję SQL lub grupę instrukcji SQL jako jedną jednostkę logiczną, a jeśli jakakolwiek instrukcja zawiedzie, cała transakcja kończy się niepowodzeniem.

Aby włączyć obsługę transakcji ręcznych zamiast trybu automatycznego zatwierdzania , z którego domyślnie korzysta sterownik JDBC, użyj funkcjisetAutoCommit()metoda. Jeśli przekazujesz wartość logiczną false do setAutoCommit (), wyłączasz automatyczne zatwierdzanie. Możesz przekazać wartość logiczną true, aby ponownie ją włączyć.

Na przykład, jeśli masz obiekt Connection o nazwie conn, zakoduj następujący kod, aby wyłączyć automatyczne zatwierdzanie -

conn.setAutoCommit(false);

Zatwierdź i wycofaj

Gdy skończysz ze zmianami i chcesz je zatwierdzić, zadzwoń commit() metoda na obiekcie połączenia w następujący sposób -

conn.commit( );

W przeciwnym razie, aby przywrócić aktualizacje bazy danych wykonanej przy użyciu połączenia o nazwie conn, użyj następującego kodu -

conn.rollback( );

Poniższy przykład ilustruje użycie obiektu zatwierdzenia i wycofania -

try{
   //Assume a valid connection object conn
   conn.setAutoCommit(false);
   Statement stmt = conn.createStatement();
   
   String SQL = "INSERT INTO Employees  " +
                "VALUES (106, 20, 'Rita', 'Tez')";
   stmt.executeUpdate(SQL);  
   //Submit a malformed SQL statement that breaks
   String SQL = "INSERTED IN Employees  " +
                "VALUES (107, 22, 'Sita', 'Singh')";
   stmt.executeUpdate(SQL);
   // If there is no error.
   conn.commit();
}catch(SQLException se){
   // If there is any error.
   conn.rollback();
}

W takim przypadku żadna z powyższych instrukcji INSERT nie zakończy się sukcesem i wszystko zostanie wycofane.

Aby lepiej zrozumieć, przeanalizujmy Commit - przykładowy kod .

Korzystanie z Savepoints

Nowy interfejs JDBC 3.0 Savepoint zapewnia dodatkową kontrolę nad transakcjami. Większość nowoczesnych DBMS obsługuje punkty zapisu w swoich środowiskach, takich jak Oracle PL / SQL.

Kiedy ustawiasz punkt zapisu, definiujesz logiczny punkt wycofania w ramach transakcji. Jeśli błąd wystąpi za punktem zapisu, można użyć metody wycofywania zmian, aby cofnąć wszystkie zmiany lub tylko zmiany wprowadzone po punkcie zapisu.

Obiekt Connection ma dwie nowe metody, które pomagają w zarządzaniu punktami zapisu -

  • setSavepoint(String savepointName):Definiuje nowy punkt zapisu. Zwraca także obiekt Savepoint.

  • releaseSavepoint(Savepoint savepointName):Usuwa punkt zapisu. Zauważ, że wymaga to obiektu Savepoint jako parametru. Ten obiekt jest zwykle punktem zapisu generowanym przez metodę setSavepoint ().

Jest jeden rollback (String savepointName) metoda, która przywraca pracę do określonego punktu zapisu.

Poniższy przykład ilustruje użycie obiektu Savepoint -

try{
   //Assume a valid connection object conn
   conn.setAutoCommit(false);
   Statement stmt = conn.createStatement();
   
   //set a Savepoint
   Savepoint savepoint1 = conn.setSavepoint("Savepoint1");
   String SQL = "INSERT INTO Employees " +
                "VALUES (106, 20, 'Rita', 'Tez')";
   stmt.executeUpdate(SQL);  
   //Submit a malformed SQL statement that breaks
   String SQL = "INSERTED IN Employees " +
                "VALUES (107, 22, 'Sita', 'Tez')";
   stmt.executeUpdate(SQL);
   // If there is no error, commit the changes.
   conn.commit();

}catch(SQLException se){
   // If there is any error.
   conn.rollback(savepoint1);
}

W takim przypadku żadna z powyższych instrukcji INSERT nie zakończy się sukcesem i wszystko zostanie wycofane.

Aby lepiej zrozumieć, przeanalizujmy punkty zapisu - przykładowy kod .