Size: a a a

Spring Framework and more

2019 November 12

RS

Ruslan Stelmachenko in Spring Framework and more
Владислав Султаняров
просто если не выносить в бин, то так не работает
это понятно. это сама суть спринга. а точнее spring aop
источник

RS

Ruslan Stelmachenko in Spring Framework and more
вся эта магия работает только если вызывать метод на заинжектенном бине. иногда еще чтобы обойти это ограничение, бин инжектят сам в себя.
источник

ВС

Владислав Султаняров in Spring Framework and more
хм
источник

RS

Ruslan Stelmachenko in Spring Framework and more
если же из бина вызвать метод этого же бина (даже будь он паблик) - никакого АОП не будет и все эти аннотации на методе проигнорируются, как будто их там и нет
источник

ВС

Владислав Султаняров in Spring Framework and more
когда я тестировал с методами, которые вызывались не через when из completablefuture,то такое поведние работало
источник

ВС

Владислав Султаняров in Spring Framework and more
например, у вас есть простой контроллер, который внутри имеет один гет метод и метод, помеченный @Transactional
если вызывать этот метод из контроллера, то транзакция сработает, как надо
источник

RS

Ruslan Stelmachenko in Spring Framework and more
на сколкьо я знаю, не сработает. может у вас метод контроллера тоже помечен @Transactional?
источник

ВС

Владислав Султаняров in Spring Framework and more
сейчас ещё раз перепроверю и код с примером отправлю
источник

П

Плющов Олександр in Spring Framework and more
Кароч долго объяснять. Надо больше инфы. Области видимости методов. Как регулируется persistentcontext  и т.д.
источник

П

Плющов Олександр in Spring Framework and more
Кода побольше.
источник

ВС

Владислав Султаняров in Spring Framework and more
https://gist.github.com/eltgm/0087d0b8ab905c708d9909fb2f9f55d3
Вы были правы.
В такой ситуации транзакция не работает.
если раскомментировать 12 строку и закомментировать 14, то будет работать
Если убрать @Transactional тоже не будет работать
источник

RS

Ruslan Stelmachenko in Spring Framework and more
Владислав Султаняров
Всем привет!
Нужна помощь по работе с транзакциями в completable future
spring boot + spring data mongo
При попытке коммита при непонятных обстаятельствах возникает исключение - Command failed with error 251 (NoSuchTransaction): 'Transaction 1 has been aborted.'
Те, может возникнуть, а может и нет
и вся транзакция рушится и не комитится
Кто-то сталкивался с этим или есть какие-то более хорошее решения для менеджмента транзакций в таком случае?
Код - https://gist.github.com/eltgm/5fda07816edebcbb64273fe3bf4a2b6c
А то, что с whenComplete такой код как в гисте, иногда работает, а иногда нет, может быть связано с потоками. whenComplete может выполняться в том же потоке, а может в другом (как повезет). А дефолтный TransactionManager в спринге хранит контекст транзакции в ThreadLocal. Так что если у вас открывается транзакция где-то раньше, и потом whenComplete выполняется в том же потоке, то он открывает вложенную транзакцию, а если в другом потоке - то новую. От этого может различаться поведение.

Понятно, что это не 100% из-за этого. Но можно в эту сторону покопать. Выведите название потока в лог и смотрите, когда все ломается, совпадает оно в whenComplete с назавнием того потока, из которого CompleatableFuture был создан, или отличается.
источник

RS

Ruslan Stelmachenko in Spring Framework and more
> если раскомментировать 12 строку и закомментировать 14, то будет работать
будет, но благодаря @Transactional на методе get(), а не на методе test().

Транзакция на методе test() в данном коде просто игнорируется.
источник

ВС

Владислав Султаняров in Spring Framework and more
думал на счёт этого, но у меня ведь работа с транзакцией начинается как раз уже под whenComplete, а не раньше
источник

ВС

Владислав Султаняров in Spring Framework and more
да, это я понял
источник

ВС

Владислав Султаняров in Spring Framework and more
те, у меня транзакция начинается и заканчивается в рамках одного whenComplete
источник

RS

Ruslan Stelmachenko in Spring Framework and more
Владислав Султаняров
думал на счёт этого, но у меня ведь работа с транзакцией начинается как раз уже под whenComplete, а не раньше
тогда не знаю. может быть где-то раньше @Transactional закралась в какой-то метод и забылась)

попробуйте включить уровень debug для соответсвующих пакетов спринга. там довольно подробно он логирует все, что происходит.

logging.level.org.springframework.orm.jpa=DEBUG
logging.level.org.springframework.transaction=DEBUG
источник

RS

Ruslan Stelmachenko in Spring Framework and more
да, jpa это пожалуй не про монгу) но про монгу наверняка тоже есть пакет
источник

ВС

Владислав Султаняров in Spring Framework and more
Ruslan https://gist.github.com/eltgm/522c23720d5957ebf13906ce4b5dbddc
вот так это работает, как Вы и говорили
источник

ВС

Владислав Султаняров in Spring Framework and more
думаю, попробую переписать в своей логике под такое поведение
источник