Java for Beginner
672 subscribers
541 photos
155 videos
12 files
827 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Управление транзакциями вручную

Хотя 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