Как вы знаете, когда вы проксируете объект, например, когда вы создаете bean с транзакционными атрибутами для Spring/EJB или даже когда вы создаете частичный макет с некоторыми фреймворками, объект proxies не знает, что, а внутренние вызовы не перенаправляются, а затем не перехватываются...
Вот почему, если вы делаете что-то подобное в Spring:
@Transactionnal
public void doSomething() {
doSomethingInNewTransaction();
doSomethingInNewTransaction();
doSomethingInNewTransaction();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doSomethingInNewTransaction() {
...
}
Когда вы вызываете doSomething, вы ожидаете иметь 3 новых транзакции в дополнение к основному, но на самом деле из-за этой проблемы вы получаете только один...
Так что интересно, как вы справляетесь с такими проблемами...
Я нахожусь в ситуации, когда я должен обрабатывать сложную транзакционную систему, и я не вижу лучшего способа, чем разделение моего сервиса на многие небольшие службы, поэтому я уверен, что пройду через все прокси...
Это меня очень беспокоит, потому что весь код принадлежит к одному и тому же функциональному домену и не должен быть разделен...
Я нашел этот связанный вопрос с интересными ответами: Spring - @Transactional - Что происходит в фоновом режиме?
Rob H говорит, что мы можем ввести прокси-сервер spring внутри службы и вызвать proxy.doSomethingInNewTransaction(); вместо. Это довольно легко сделать, и это работает, но мне это не очень нравится...
Юньфэн Хоу говорит об этом:
Итак, я пишу свою собственную версию CglibSubclassingInstantiationStrategy и прокси-создателя, чтобы он использовал CGLIB для создания реального подкласса которые делегаты призывают к своему супер, а не к другому экземпляру, который spring делает сейчас. Поэтому я могу свободно комментировать любые методы (так долго поскольку он не является частным), и откуда бы я ни называл эти методы, они будет позаботиться. Ну, у меня еще есть цена для оплаты: 1. Я должен перечислить все аннотации, которые я хочу включить в новый подкласс класса CGLIB создание. 2. Я не могу аннотировать окончательный метод, так как я сейчас генерируя подкласс, поэтому окончательный метод не может быть перехвачен.
Что он подразумевает под словом "который spring делает сейчас"? Означает ли это, что внутренние транзакционные вызовы теперь перехватываются?
Как вы думаете, лучше?
Разделяете ли вы свои классы, когда вам нужна гранулярность транзакций? Или вы используете некоторое обходное решение, как описано выше? (пожалуйста, поделитесь им)