Какой кратчайший способ поменять поэтапные и нематериальные изменения в git?

Если некоторые изменения добавлены в индекс, а есть некоторые изменения, которые не добавлены в индекс, Моя ситуация выглядит следующим образом: у меня есть бин A, который опутан транзакцией и он вызывает bean-компонент B, который определяется с помощью транзакции ...

Я использую управление транзакциями с помощью Spring и Hibernate. Моя ситуация выглядит следующим образом:
У меня есть бин A , который окружен транзакцией и он вызывает bean-компонент B , который определен с транзакцией, включающей атрибут PROPAGATION_REQUIRED

B, в этом случае не открывает новую транзакцию, а использует ожидающую транзакцию (см. в журналах: «Участие в существующей» сделка'). Однако в случае, если метод в B сгенерирует исключение runtimeException, на обратном пути к A он испачкает транзакцию и заставит ее пометить для отката, даже если внешний метод A перехватит исключение и не будет выброси это. Я думаю, что это неправильное поведение, в этом случае я хочу, чтобы A управлял транзакцией, а B ни в коем случае не должен прерывать транзакцию.
Есть ли способ определить B, чтобы открыть транзакцию, если транзакция не определена, но НИЧЕГО, если она уже находится внутри существующей транзакции, и пусть верхний уровень принимает решение о принятии или откате?

Другие отзывы об этой проблеме в теме сообщества Spring здесь .

8
задан Spiderman 30 August 2010 в 12:21
поделиться

3 ответа

Теоретически это возможно, но не в рамках стандартных средств аспектов транзакций Spring.Вам нужно будет создать свой собственный аспект, который дублирует стандартную функциональность Spring, расширяя ее для вашего особого случая. Возможно, даже удастся расширить исходный аспект, который они используют.

(Возможно, вам придется определить пользовательскую аннотацию, потому что вы не можете ни переопределить атрибут @Transactional, ни расширить перечисление Propagation.)

Вот несколько советов:

Также вам следует прочитать книгу AspectJ в действии, даже если вы просто хотите использовать Spring AOP , так как дает очень хороший обзор.

Хорошей отправной точкой является загрузка исходников jar spring-aspects, просмотр, что они там делают, и предоставление собственного расширения либо org.springframework.transaction.aspectj.AbstractTransactionAspect или org.springframework.transaction.aspectj.AnnotationTransactionAspect

Подводя итог: я уверен, что это можно сделать, но это потребует много работы. Однако Spring Transaction API довольно хорош. Может быть, вам стоит научиться жить с его ограничениями. Если нет: начать взлом (см. выше)

3
ответ дан 5 December 2019 в 12:53
поделиться

Может быть, использование аннотации @Transactional способом, показанным ниже, решит вашу проблему? @Transactional (распространение = распространение.REQUIRED, noRollbackFor = RuntimeException.class)

0
ответ дан 5 December 2019 в 12:53
поделиться

Одним из решений является предоставление ДВУХ определений компонентов в файле context.xml.

  • Один с PROPAGATION_REQUIRED, который вы будете использовать, если хотите, чтобы компонент был транзакционным.

  • Второй с PROPAGATION_SUPPORTS, который вы будете использовать, когда вы вызываете компонент из существующей транзакции (на самом деле, он может быть даже нетранзакционным).

Если вы хотите свести к минимуму дублирование, вы можете включить общую конфигурацию в определение родительского компонента.

0
ответ дан 5 December 2019 в 12:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: