Почему Spring пытается использовать транзакцию только для чтения, когда я явно запросил новую транзакцию записи?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему Spring пытается использовать транзакцию только для чтения, когда я явно запросил новую транзакцию записи?

Сообщение Anonymous »

У меня есть метод службы, который последовательно выполняет следующие операции:
  • Вызывает метод чтения, аннотированный пользовательской аннотацией транзакции, доступной только для чтения (эквивалентно @Transactional(readOnly = true))
  • Затем вызывает метод записи, аннотированный пользовательской аннотацией, которая должна создать новую транзакцию (эквивалентно @Transactional(propagation = Propagation.REQUIRES_NEW))
Я получаю эту ошибку:
[ERROR: cannot execute UPDATE in a read-only transaction]

Пример: спасибо @Robert
// Service class with transactional methods
@Service
public class UserService {

@Autowired
private UserRepository userRepository;

// Read-only transaction
@Transactional(readOnly = true)
public User findUserById(Long id) {
return userRepository.findById(id).orElse(null);
}

// Write transaction with REQUIRES_NEW
@Transactional(propagation = Propagation.REQUIRES_NEW)
public User updateUser(User user) {
return userRepository.save(user);
}
}

// Orchestrator service
@Service
public class UserOrchestrationService {

@Autowired
private UserService userService;

@Autowired
private NotificationService notificationService;

// No transaction annotation on this method
public void processUserUpdate(Long userId, String newEmail) {
// Step 1: Read user with READ-ONLY transaction
User existingUser = userService.findUserById(userId);

if (existingUser == null) {
throw new RuntimeException("User not found");
}

// Step 2: Modify user data
existingUser.setEmail(newEmail);
existingUser.setLastModified(new Date());

// Step 3: Save with REQUIRES_NEW transaction - FAILS HERE!
User updatedUser = userService.updateUser(existingUser);

// Step 4: Send notification
notificationService.sendUpdateNotification(updatedUser);
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... tly-reques
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»