powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как правильно работать с @Transactional
25 сообщений из 31, страница 1 из 2
Как правильно работать с @Transactional
    #38989715
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использую Spring Data.
Есть 2 сущности:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
@Entity
@Table(name = "client")
public class Client {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
.....................


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
@Entity
@Table(name = "client_details")
public class ClientDetails {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @OneToOne
    @JoinColumn(name = "client_id")
    private Client client;
.....................


Далее:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
@Transactional(propagation= Propagation.REQUIRED, rollbackFor = CustomException.class)
    public RegisterResponse clientRegister(Client client) throws CustomException{
      //  сохраняю пользователя   
      Client client = clientRepository.save(client);
      
      // ЗДЕСЬ ПРОИСХОДИТ КАКОЙ-ТО EXCEPTION 

      //  сохраняю детали пользователя
      ClientDetails clientDetails = new ClientDetails();
      clientDetails .setClient(client);
      clientDetailsRepository.save(clientDetails);    
}


Код: java
1.
2.
3.
CustomException extends RuntimeException{
    private int code;
    private String message;


Я ожидаю, что при возникновении ошибки произойдет полный откат транзакции, но не тут-то было, клиент сохраняется в базе Client client = clientRepository.save(client);, а clientDetails естественно нет. Как быть, подскажите пожалуйста?
Спасибо
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38989724
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Должен быть не какой-то Exception, а тот которым вы хотите откатывать. Спринг по умолчанию откатывает по любому RuntimeException
2) Надо убедиться что контейнер вообще настроен на транзакции. Может просто ваши аннотации никто и не использует?
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38989879
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz1) Должен быть не какой-то Exception, а тот которым вы хотите откатывать. Спринг по умолчанию откатывает по любому RuntimeException
2) Надо убедиться что контейнер вообще настроен на транзакции. Может просто ваши аннотации никто и не использует?

1. В методе для эксперимента я генерирую свой эксепшн:
Код: java
1.
throw new CustomException(300, "custom exception");


по нему и откатываюсь:
Код: java
1.
rollbackFor = CustomException.class


По поводу пункта 2. Контейнер настроен следующим образом:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:jpa="http://www.springframework.org/schema/data/jpa"
       xmlns:task="http://www.springframework.org/schema/task" xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
...........
<context:annotation-config/>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager" />


Все вроде как правильно, а откатываться не хочет.
ХЭЛП!
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38989917
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT1. В методе для эксперимента я генерирую свой эксепшн:
Код: java
1.
throw new CustomException(300, "custom exception");



Из коментария //ЗДЕСЬ ПРОИСХОДИТ КАКОЙ-ТО EXCEPTION это не совсем очевидно.

по нему и откатываюсь: [src java]

JulTВсе вроде как правильно, а откатываться не хочет.

А все бины точно управляются контейнером. А то ту многие пишут new Service().runMyMethod() и ждут что Спринг им транзакций принесет на тарелочке.
stacktrace для CustomException можно увидеть?
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38989938
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Blazkowicz]JulT1. В методе для эксперимента я генерирую свой эксепшн:
Код: java
1.
throw new CustomException(300, "custom exception");



Из коментария //ЗДЕСЬ ПРОИСХОДИТ КАКОЙ-ТО EXCEPTION это не совсем очевидно.

по нему и откатываюсь:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
[quot JulT]Все вроде как правильно, а откатываться не хочет. 
[/quot]
А все бины точно управляются контейнером. А то ту многие пишут new Service().runMyMethod() и ждут что Спринг им транзакций принесет на тарелочке.
stacktrace для CustomException можно увидеть?[/quot]
Да, точно. Стектрейс:
[SRC java]ERROR CustomExceptionHandler - ########## CUSTOM exception: 
ru.test.common.mobile.model.CustomException: custom exception
	at ru.test.services.client.ClientService.clientRegister(ClientService.java:1501)
	at ru.test.services.client.ClientService$$FastClassByCGLIB$$3f82d9f1.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:710)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:643)
	at ru.test.services.client.ClientService$$EnhancerByCGLIB$$4fc9e07b.clientRegister(<generated>)
	at ru.test.controllers.mobile.ClientController.register(ClientController.java:167)
	at ru.test.controllers.mobile.ClientController$$FastClassByCGLIB$$45d51213.invoke(<generated>)
..........
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38989956
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TransactionInterceptor на месте. Интересно. JPA спрингом инициализируется?
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38989963
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если EMF в TransactionManager и в Repository один и тот же, то надо лог смотреть. Так на вскидку, вроде, конфигурация норм.
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38989970
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно вместо того чтобы гадать подебажить TransactionInterceptor. Посмотреть как он реагирует на исключение и что именно вызывает для отката.
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38989978
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может проблема связана с конфигурациями. У меня их 2.
1. application-context.xml:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:jpa="http://www.springframework.org/schema/data/jpa"
       xmlns:task="http://www.springframework.org/schema/task" xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">

    <bean id="propertyPlaceholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
        <property name="ignoreResourceNotFound" value="true"/>
        <property name="locations">
            <list>
                <value>classpath:profiles/default.properties</value>
                <value>classpath:profiles/${spring.profiles.active}.properties</value>
            </list>
        </property>
    </bean>

    <mvc:resources mapping="/profiles/*" location="file:/${profiles.path}"/>

    <context:annotation-config/>

    <jpa:repositories base-package="ru.test.repositories"/>

    <context:component-scan base-package="ru.test.services"/>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <tx:annotation-driven/>


    <!-- BoneCP configuration -->
    <bean id="boneCPDataSource" class="com.jolbox.bonecp.BoneCPDataSource" lazy-init="true" destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>

        <property name="idleConnectionTestPeriodInMinutes" value="1"/>
        <property name="idleMaxAgeInMinutes" value="4"/>
        <property name="maxConnectionsPerPartition" value="30"/>
        <property name="minConnectionsPerPartition" value="1"/>
        <property name="poolAvailabilityThreshold" value="5"/>
        <property name="partitionCount" value="1"/>
        <property name="acquireIncrement" value="3"/>
        <property name="statementsCacheSize" value="50"/>
        <property name="connectionTestStatement" value="SELECT 1"/>
    </bean>


    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="TestPm"/>
        <property name="dataSource" ref="boneCPDataSource"/>
        <!--boneCPDataSource-->
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
                <property name="showSql" value="false"/>
                <property name="generateDdl" value="true"/>
            </bean>
        </property>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
                <prop key="hibernate.id.new_generator_mappings">${hibernate.id.new_generator_mappings}</prop>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.connection.pool_size">20</prop>

                <prop key="jadira.usertype.autoRegisterUserTypes">true</prop>
                <prop key="jadira.usertype.currencyCode">USD</prop>
                <prop key="jadira.usertype.databaseZone">UTC</prop>
                <prop key="jadira.usertype.javaZone">UTC</prop>
            </props>
        </property>
    </bean>

    <bean id="loggingProcessor" class="ru.test.services.logging.LoggerPostProcessor"/>


    <task:executor id="myExecutor" pool-size="20"/>

    <task:scheduler id="myScheduler" pool-size="20"/>


    <task:annotation-driven executor="exceptionHandlingTaskExecutor" scheduler="myScheduler"/>

    <bean id="exceptionHandlingTaskExecutor" class="ru.test.utils.ExceptionHandlingAsyncTaskExecutor">
        <constructor-arg ref="myExecutor"/>
    </bean>

</beans>



2. Для MVC
rest-servlet.xml:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <bean id="propertyPlaceholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
        <property name="ignoreResourceNotFound" value="true"/>
        <property name="locations">
            <list>
                <value>classpath:profiles/default.properties</value>
                <value>classpath:profiles/${spring.profiles.active}.properties</value>
            </list>
        </property>
    </bean>


    <mvc:annotation-driven/>

    <tx:annotation-driven/>

    <context:component-scan base-package="ru.test.controllers"/>

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>


И там и там стоит <tx:annotation-driven/>. Вообще не понятно зачем отдельный конфиг для MVC, можно ведь все в application-context.xml держать...
Ладно, завтра буду пробовать ваши советы на практике. Спасибо
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38989980
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, если у вас создаётся два контекста, то при вызове из контроллера работает только web контекст, в котором нет JPA конфигурации.
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38989985
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczДа, если у вас создаётся два контекста, то при вызове из контроллера работает только web контекст, в котором нет JPA конфигурации.
спасибо, завтра буду пробовать дальше :)
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38990034
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczДа, если у вас создаётся два контекста, то при вызове из контроллера работает только web контекст, в котором нет JPA конфигурации.
Извините за вмешательство и глупый вопрос. BoneCPDataSource не является наследником XADataSource. С какого перепугу JdbcTransaction должен стать JtaTransaction?
Я то думал, что в описании DataSource для JBoss, в этом случае обязательно надо указывать jta="true". Тогда сервер создает обвертку LocalXADataSource. Ну или на худой конец, указывать DataSource и XADataSource. JavaEE сервер сам разберется, когда надо цеплять XADataSource, а когда DataSource.

Аннотации javax.transaction.Transactional распространяются только на JTA и не распространяются на JDBC. Может, в Spring все более туманно.
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38990042
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
galsИзвините за вмешательство и глупый вопрос. BoneCPDataSource не является наследником XADataSource. С какого перепугу JdbcTransaction должен стать JtaTransaction?
В stackoverflow подсмотрел?
С какого перепугу а Юлии JTA? Скорее всего обычные локальные JDBC транзакции.

gals Аннотации javax.transaction.Transactional распространяются только на JTA и не распространяются на JDBC. Может, в Spring все более туманно.
Хорошая попытка, но нет
Код: java
1.
2.
@javax.transaction.Transactional(rollbackOn)
@org.springframework.transaction.annotation.Transactional(rollbackFor)
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38990044
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего вот эта ситуация
http://stackoverflow.com/a/10564908
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38990098
UrvSO3000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JulT,

Я думаю, что ты путаешь контексты сервлета и корневые контексты. Их нельзя путать. Транзакции будут работать только там, где объявлен tx:annotation-driven. Подробнее можешь прочитать вот здесь:
http://urvanov.ru/2015/06/17/spring-framework-общий-контекст-root-context-xml-и-контекст-серв/
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38990261
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем огромное спасибо за комменты, очень познавательно.
Итак, я убрала <tx:annotation-driven/> из rest-servlet.xml, теперь <tx:annotation-driven transaction-manager="transactionManager"/> находится в application-context.xml.
Вы пишите:
BlazkowiczДа, если у вас создаётся два контекста, то при вызове из контроллера работает только web контекст, в котором нет JPA конфигурации.
Получается, что все, что связано с JPA:
Код: java
1.
2.
3.
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

и т.д.
необходимо перенести в rest-servlet.xml? Но вот человек приводит ссылку http://urvanov.ru/2015/06/17/spring-framework-общий-контекст-root-context-xml-и-контекст-серв/ где сказано, что транзакции, настройка dataSource и прочее должны лежать в application-context.xml. Как быть? Спасибо.
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38990265
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Цепочка вызовов следующая.
Контроллер:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
@Controller
@RequestMapping("/client")
public class ClientController
....
@RequestMapping(value = "/register", method = RequestMethod.POST)
    public
    @ResponseBody
    ClientRegisterResponse register(@RequestBody ClientRegisterRequest request) {
        return clientService.clientRegister(....);
    }


Далее выполнение переходит к сервисному слою
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@Service
@Transactional
public class СlientService 
...........
@Transactional(propagation= Propagation.REQUIRED, rollbackFor = CustomException.class)
    public RegisterResponse clientRegister(Client client) throws CustomException{
      Client client = clientRepository.save(client);
      throw new CustomException(300, "custom exception");
.............


здесь вызывается метод register, который аннтотирован @Transactional(propagation= Propagation.REQUIRED, rollbackFor = CustomException.class), в нем и происходит исключение.
Блин, уже перепробовала кучу вариантов, откат не работает, клиенты по-прежнему плодятся в базе
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38990464
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
clientRepository - какой код ???
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38990561
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1clientRepository - какой код ???
Код: java
1.
2.
@Repository
public interface ClientRepository extends PagingAndSortingRepository<Client, Long> {
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38990614
Pavel Kurakin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если убрать @Transactional с класса?
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38990666
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel KurakinА если убрать @Transactional с класса?
до лампочки
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38990671
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

Воспользуйтесь пошаговой отладкой в TransactionInterceptor, делов минут на 10.
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38990678
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это просто жесть какая-то.
В этом же контроллере, с этим же сервисным классом делаю простой тестовый метод:
Код: java
1.
2.
3.
4.
5.
    @Transactional(propagation= Propagation.REQUIRED, rollbackFor = CustomException.class)
    public void transactTest(){
        clientRepository.save(new Client());
        throw new CustomException(-5, "Transaction rollBack");
}


и все отрабатывает как и хотелось, магия...........
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38990701
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

throws CustomException?
...
Рейтинг: 0 / 0
Как правильно работать с @Transactional
    #38990710
Pavel Kurakin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTмагия...
Чудес не бывает :)

Мне кажется, что транзакция стартует где-то раньше, и соответственно метод использует уже существующую транзакцию. Ну а раз не он ее начал, то и не ему ее откатывать.
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Как правильно работать с @Transactional
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]