Rollback и Commit транзакций
Транзакции в приложениях обеспечивают выполнение группы операций над базой данных как единого целого. Два основных действия, которые завершают транзакцию, — это commit и rollback.
Что такое Commit?
Commit фиксирует все изменения, сделанные в рамках транзакции, и делает их видимыми для других транзакций. После выполнения команды commit изменения становятся постоянными и не могут быть отменены.
Пример в SQL:
Что такое Rollback?
Rollback отменяет все изменения, сделанные в рамках текущей транзакции, возвращая базу данных в состояние, предшествующее началу транзакции. Это полезно при возникновении ошибок, когда необходимо гарантировать, что никакие частично выполненные изменения не будут зафиксированы.
Пример в SQL:
Rollback и Commit в Spring
В Spring транзакции можно управлять как вручную, так и декларативно с помощью аннотации @Transactional.
Пример ручного управления:
#Java #Training #Spring #Rollback #Commit
Транзакции в приложениях обеспечивают выполнение группы операций над базой данных как единого целого. Два основных действия, которые завершают транзакцию, — это commit и rollback.
Что такое Commit?
Commit фиксирует все изменения, сделанные в рамках транзакции, и делает их видимыми для других транзакций. После выполнения команды commit изменения становятся постоянными и не могут быть отменены.
Пример в SQL:
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;
В этом случае изменения будут сохранены в базе данных.
Что такое Rollback?
Rollback отменяет все изменения, сделанные в рамках текущей транзакции, возвращая базу данных в состояние, предшествующее началу транзакции. Это полезно при возникновении ошибок, когда необходимо гарантировать, что никакие частично выполненные изменения не будут зафиксированы.
Пример в SQL:
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
ROLLBACK;
В этом случае все изменения будут отменены.
Rollback и Commit в Spring
В Spring транзакции можно управлять как вручную, так и декларативно с помощью аннотации @Transactional.
Пример ручного управления:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
@Service
public class ManualTransactionService {
@Autowired
private PlatformTransactionManager transactionManager;
public void transferMoney(Long fromAccountId, Long toAccountId, double amount) {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = transactionManager.getTransaction(def);
try {
// Дебет с одного счета
debitAccount(fromAccountId, amount);
// Кредит на другой счет
creditAccount(toAccountId, amount);
// Подтверждение транзакции
transactionManager.commit(status);
} catch (Exception ex) {
// Откат транзакции в случае ошибки
transactionManager.rollback(status);
throw ex;
}
}
private void debitAccount(Long accountId, double amount) {
// Логика дебетовой операции
}
private void creditAccount(Long accountId, double amount) {
// Логика кредитной операции
}
}
#Java #Training #Spring #Rollback #Commit
Rollback с использованием @Transactional
В декларативном подходе Spring автоматически выполняет rollback для транзакций, если метод выбрасывает RuntimeException или Error.
Пример:
Принудительный rollback
Если требуется явно указать Spring, что транзакция должна быть откатана, можно использовать TransactionAspectSupport:
#Java #Training #Spring #Rollback #Commit
В декларативном подходе Spring автоматически выполняет rollback для транзакций, если метод выбрасывает RuntimeException или Error.
Пример:
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class PaymentService {
@Transactional
public void processPayment(Long orderId) {
try {
// Обновление информации о заказе
updateOrder(orderId);
// Обновление платежной информации
updatePayment(orderId);
} catch (Exception e) {
// Логика обработки исключения
throw new RuntimeException("Ошибка при обработке платежа");
}
}
private void updateOrder(Long orderId) {
// Логика обновления заказа
}
private void updatePayment(Long orderId) {
// Логика обновления платежа
}
}
Если возникает RuntimeException, Spring автоматически откатывает транзакцию.
Принудительный rollback
Если требуется явно указать Spring, что транзакция должна быть откатана, можно использовать TransactionAspectSupport:
import org.springframework.transaction.interceptor.TransactionAspectSupport;
public void performOperation() {
try {
// Код операции
} catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
#Java #Training #Spring #Rollback #Commit