Каков наилучший способ убедиться, что транзакционный метод не распространяется на транзакционный метод только для чтения ⇐ JAVA
Каков наилучший способ убедиться, что транзакционный метод не распространяется на транзакционный метод только для чтения
В настоящее время я столкнулся с проблемой с двумя методами одного и того же сервиса Spring. Вот простой пример:
@Transactional(readOnly = true) public Необязательный readSomeEntity (строка idEntity) { верните this.someEntityRepository.findById(idEntity); } @Транзакционный public Необязательный readOrCreateSomeEntity (объект SomeEntity) { если (this.someEntityRepository.existsById(entityInfo.getId()) { // Как сделать так, чтобы этот вызов проходил через Spring Proxy и собственно // применяется @Transactional(readOnly = true)? вернуть this.readSomeEntity(entityId.getId()); } еще { return Необязательный.of(this.someEntityRepository.save(entity)); } } Как на самом деле убедиться, что в контексте @Transactional (не только для чтения) readOrCreateSomeEntity фактический вызов readSomeEntity чисто завернутый в транзакционный контекст только для чтения? И что транзакционный контекст readOrCreateSomeEntity не распространяется?
Я подумал о двух вариантах:
[*]Используйте ссылку на самого себя @Autowired MyService self. Но это проблема, поскольку она приводит к циклической ссылке и ошибке создания контекста. [*]Я также думал о @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW), но он даже не обрабатывается Spring, поскольку я не вызываю readSomeEntity< /code> через прокси!
Можно ли этого добиться, и если да, то возможно ли это только путем обращения к самому себе?
С чисто технической точки зрения я бы предпочел, чтобы readSomeEntity действительно был на 100% доступен только для чтения, потому что, эй, это метод только для чтения, и я не понимаю, почему Spring распространяет его не только для чтения. транзакционный контекст для подметода чтения. Я ошибаюсь, думая так?
В конце концов, должно ли меня это волновать? Не слишком ли сложно требовать, чтобы этот метод чтения на самом деле не выполнял обновления на 100 %, желая иметь транзакционный контекст только для чтения?
Спасибо за понимание.
В настоящее время я столкнулся с проблемой с двумя методами одного и того же сервиса Spring. Вот простой пример:
@Transactional(readOnly = true) public Необязательный readSomeEntity (строка idEntity) { верните this.someEntityRepository.findById(idEntity); } @Транзакционный public Необязательный readOrCreateSomeEntity (объект SomeEntity) { если (this.someEntityRepository.existsById(entityInfo.getId()) { // Как сделать так, чтобы этот вызов проходил через Spring Proxy и собственно // применяется @Transactional(readOnly = true)? вернуть this.readSomeEntity(entityId.getId()); } еще { return Необязательный.of(this.someEntityRepository.save(entity)); } } Как на самом деле убедиться, что в контексте @Transactional (не только для чтения) readOrCreateSomeEntity фактический вызов readSomeEntity чисто завернутый в транзакционный контекст только для чтения? И что транзакционный контекст readOrCreateSomeEntity не распространяется?
Я подумал о двух вариантах:
[*]Используйте ссылку на самого себя @Autowired MyService self. Но это проблема, поскольку она приводит к циклической ссылке и ошибке создания контекста. [*]Я также думал о @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW), но он даже не обрабатывается Spring, поскольку я не вызываю readSomeEntity< /code> через прокси!
Можно ли этого добиться, и если да, то возможно ли это только путем обращения к самому себе?
С чисто технической точки зрения я бы предпочел, чтобы readSomeEntity действительно был на 100% доступен только для чтения, потому что, эй, это метод только для чтения, и я не понимаю, почему Spring распространяет его не только для чтения. транзакционный контекст для подметода чтения. Я ошибаюсь, думая так?
В конце концов, должно ли меня это волновать? Не слишком ли сложно требовать, чтобы этот метод чтения на самом деле не выполнял обновления на 100 %, желая иметь транзакционный контекст только для чтения?
Спасибо за понимание.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение