Учебники

JDBC — Сделки

Если ваше JDBC-соединение находится в режиме автоматической фиксации , которым он является по умолчанию, то каждый оператор SQL фиксируется в базе данных после его завершения.

Это может быть хорошо для простых приложений, но есть три причины, по которым вы можете отключить автоматическую фиксацию и управлять своими собственными транзакциями —

  • Для увеличения производительности.

  • Для поддержания целостности бизнес-процессов.

  • Использовать распределенные транзакции.

Для увеличения производительности.

Для поддержания целостности бизнес-процессов.

Использовать распределенные транзакции.

Транзакции позволяют вам контролировать, когда и когда изменения применяются к базе данных. Он обрабатывает один оператор SQL или группу операторов SQL как одну логическую единицу, и в случае сбоя любого оператора происходит сбой всей транзакции.

Чтобы включить поддержку транзакций вручную вместо режима автоматической фиксации, который драйвер JDBC использует по умолчанию, используйте метод setAutoCommit () объекта Connection. Если вы передадите логическое значение false в setAutoCommit (), вы отключите автоматическую фиксацию. Вы можете передать логическое значение true, чтобы снова включить его.

Например, если у вас есть объект Connection с именем conn, напишите следующее, чтобы отключить автоматическую фиксацию:

conn.setAutoCommit(false);

Фиксация и откат

Как только вы закончите с вашими изменениями и захотите их зафиксировать, вызовите метод commit () для объекта подключения следующим образом:

conn.commit( );

В противном случае, чтобы откатить обновления базы данных, выполненные с использованием Connection с именем conn, используйте следующий код —

conn.rollback( );

Следующий пример иллюстрирует использование объекта commit и rollback —

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();
}

В этом случае ни один из приведенных выше операторов INSERT не будет успешным, и все будет отменено.

Для лучшего понимания давайте изучим коммит — пример кода .

Использование точек сохранения

Новый интерфейс JDBC 3.0 Savepoint дает вам дополнительный транзакционный контроль. Большинство современных СУБД поддерживают точки сохранения в своих средах, таких как Oracle PL / SQL.

Когда вы устанавливаете точку сохранения, вы определяете логическую точку отката в транзакции. Если после точки сохранения возникает ошибка, вы можете использовать метод отката, чтобы отменить все изменения или только изменения, сделанные после точки сохранения.

Объект Connection имеет два новых метода, которые помогут вам управлять точками сохранения.

  • setSavepoint (String savepointName): определяет новую точку сохранения. Он также возвращает объект Savepoint.

  • releaseSavepoint (Savepoint savepointName): удаляет точку сохранения. Обратите внимание, что в качестве параметра требуется объект Savepoint. Этот объект обычно является точкой сохранения, сгенерированной методом setSavepoint ().

setSavepoint (String savepointName): определяет новую точку сохранения. Он также возвращает объект Savepoint.

releaseSavepoint (Savepoint savepointName): удаляет точку сохранения. Обратите внимание, что в качестве параметра требуется объект Savepoint. Этот объект обычно является точкой сохранения, сгенерированной методом setSavepoint ().

Существует один метод отката (String savepointName) , который откатывает работу до указанной точки сохранения.

Следующий пример иллюстрирует использование объекта 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);
}

В этом случае ни один из приведенных выше операторов INSERT не будет успешным, и все будет отменено.

Для лучшего понимания давайте изучим точки сохранения — пример кода .