Транзакция — это набор действий, выполняемых как единое атомарное действие. Либо все действия выполнены, либо ни одно из них не выполнено.
Классическим примером того, когда необходимы транзакции, является пример банковских счетов.
Вам необходимо перевести 100 долларов с одного счета на другой. Вы делаете это, вычитая 100 долларов из первого аккаунта и добавляя 100 долларов ко второму аккаунту. Если этот процесс завершится неудачно после того, как вы вычли 100 долларов США из первого банковского счета, 100 долларов никогда не будут добавлены на второй банковский счет. Деньги теряются в киберпространстве.
Чтобы решить эту проблему, вычитание и сложение 100 долларов сгруппированы в транзакцию. Если вычитание выполнено успешно, но сложение не удалось, вы можете «откатить» первое вычитание. Таким образом, база данных остается в том же состоянии, что и до выполнения вычитания.
Вы начинаете транзакцию с помощью этого вызова:
connection.setAutoCommit(false);
Теперь вы можете продолжать выполнять запросы и обновления базы данных. Все эти действия являются частью сделки.
Если какое-либо действие, предпринятое в рамках транзакции, завершается неудачей, необходимо откатить транзакцию. Это сделано так:
connection.rollback();
Если все действия выполнены успешно, вы должны совершить транзакцию. Передача транзакции делает действия постоянными в базе данных. Когда совершено, пути назад уже нет. Фиксация транзакции выполняется следующим образом:
connection.commit();
Конечно, вам нужно немного попробовать-поймать-наконец, вокруг этих действий. Вот пример:
Connection connection = ...
try{
connection.setAutoCommit(false);
// create and execute statements etc.
connection.commit();
} catch(Exception e) {
connection.rollback();
} finally {
if(connection != null) {
connection.close();
}
}
Вот полный пример:
Connection connection = ...
try{
connection.setAutoCommit(false);
Statement statement1 = null;
try{
statement1 = connection.createStatement();
statement1.executeUpdate(
"update people set name='John' where id=123");
} finally {
if(statement1 != null) {
statement1.close();
}
}
Statement statement2 = null;
try{
statement2 = connection.createStatement();
statement2.executeUpdate(
"update people set name='Gary' where id=456");
} finally {
if(statement2 != null) {
statement2.close();
}
}
connection.commit();
} catch(Exception e) {
connection.rollback();
} finally {
if(connection != null) {
connection.close();
}
}
