Управление транзакциями вручную
Хотя Spring предоставляет удобный механизм декларативного управления транзакциями с помощью @Transactional, иногда требуется более тонкий контроль. В таких случаях используется ручное управление транзакциями.
Ручное управление транзакциями
Для ручного управления транзакциями в Spring используется интерфейс PlatformTransactionManager и его реализации, такие как DataSourceTransactionManager или JpaTransactionManager.
Пример: Использование PlatformTransactionManager
Программное управление в сочетании с TransactionTemplate
Spring предоставляет еще один инструмент для управления транзакциями вручную — TransactionTemplate. Это упрощает управление транзакциями за счет предоставления шаблонного метода для выполнения кода.
Пример с использованием TransactionTemplate:
#Java #Training #Spring #ManualTransactionService
Хотя Spring предоставляет удобный механизм декларативного управления транзакциями с помощью @Transactional, иногда требуется более тонкий контроль. В таких случаях используется ручное управление транзакциями.
Ручное управление транзакциями
Для ручного управления транзакциями в Spring используется интерфейс PlatformTransactionManager и его реализации, такие как DataSourceTransactionManager или JpaTransactionManager.
Пример: Использование PlatformTransactionManager
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 performManualTransaction() {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setName("CustomTransaction");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = transactionManager.getTransaction(def);
try {
// Выполнение операций в транзакции
performDatabaseOperation1();
performDatabaseOperation2();
// Фиксация транзакции
transactionManager.commit(status);
} catch (Exception ex) {
// Откат транзакции в случае ошибки
transactionManager.rollback(status);
throw ex;
}
}
private void performDatabaseOperation1() {
// Логика операции 1
}
private void performDatabaseOperation2() {
// Логика операции 2
}
}
В этом примере транзакция начинается вручную, и ее выполнение зависит от логики программы. Если возникает ошибка, транзакция откатывается.
Программное управление в сочетании с TransactionTemplate
Spring предоставляет еще один инструмент для управления транзакциями вручную — TransactionTemplate. Это упрощает управление транзакциями за счет предоставления шаблонного метода для выполнения кода.
Пример с использованием TransactionTemplate:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;
@Service
public class TemplateTransactionService {
@Autowired
private TransactionTemplate transactionTemplate;
public void executeInTransaction() {
transactionTemplate.execute(status -> {
try {
performDatabaseOperation1();
performDatabaseOperation2();
} catch (Exception ex) {
status.setRollbackOnly(); // Указание на откат транзакции
throw ex;
}
return null;
});
}
private void performDatabaseOperation1() {
// Логика операции 1
}
private void performDatabaseOperation2() {
// Логика операции 2
}
}
#Java #Training #Spring #ManualTransactionService
Когда использовать ручное управление транзакциями?
Тонкий контроль над транзакциями: Если нужно управлять транзакцией на уровне нескольких сервисов или разных контекстов.
Динамическое управление: Когда параметры транзакции (например, уровень изоляции) должны изменяться в зависимости от условий.
Исключение из стандартного поведения: Например, если нельзя использовать @Transactional из-за вызовов методов внутри одного класса.
#Java #Training #Spring #ManualTransactionService
Тонкий контроль над транзакциями: Если нужно управлять транзакцией на уровне нескольких сервисов или разных контекстов.
Динамическое управление: Когда параметры транзакции (например, уровень изоляции) должны изменяться в зависимости от условий.
Исключение из стандартного поведения: Например, если нельзя использовать @Transactional из-за вызовов методов внутри одного класса.
#Java #Training #Spring #ManualTransactionService