Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как правильно работать с @Transactional / 25 сообщений из 31, страница 1 из 2
22.06.2015, 14:41
    #38989715
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
Использую 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
22.06.2015, 14:46
    #38989724
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
1) Должен быть не какой-то Exception, а тот которым вы хотите откатывать. Спринг по умолчанию откатывает по любому RuntimeException
2) Надо убедиться что контейнер вообще настроен на транзакции. Может просто ваши аннотации никто и не использует?
...
Рейтинг: 0 / 0
22.06.2015, 16:28
    #38989879
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
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
22.06.2015, 17:01
    #38989917
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
JulT1. В методе для эксперимента я генерирую свой эксепшн:
Код: java
1.
throw new CustomException(300, "custom exception");



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

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

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

А все бины точно управляются контейнером. А то ту многие пишут new Service().runMyMethod() и ждут что Спринг им транзакций принесет на тарелочке.
stacktrace для CustomException можно увидеть?
...
Рейтинг: 0 / 0
22.06.2015, 17:17
    #38989938
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
[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
22.06.2015, 17:32
    #38989956
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
TransactionInterceptor на месте. Интересно. JPA спрингом инициализируется?
...
Рейтинг: 0 / 0
22.06.2015, 17:35
    #38989963
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
Если EMF в TransactionManager и в Repository один и тот же, то надо лог смотреть. Так на вскидку, вроде, конфигурация норм.
...
Рейтинг: 0 / 0
22.06.2015, 17:41
    #38989970
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
Можно вместо того чтобы гадать подебажить TransactionInterceptor. Посмотреть как он реагирует на исключение и что именно вызывает для отката.
...
Рейтинг: 0 / 0
22.06.2015, 17:47
    #38989978
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
Может проблема связана с конфигурациями. У меня их 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
22.06.2015, 17:50
    #38989980
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
Да, если у вас создаётся два контекста, то при вызове из контроллера работает только web контекст, в котором нет JPA конфигурации.
...
Рейтинг: 0 / 0
22.06.2015, 17:52
    #38989985
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
BlazkowiczДа, если у вас создаётся два контекста, то при вызове из контроллера работает только web контекст, в котором нет JPA конфигурации.
спасибо, завтра буду пробовать дальше :)
...
Рейтинг: 0 / 0
22.06.2015, 18:56
    #38990034
gals
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
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
22.06.2015, 19:12
    #38990042
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
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
22.06.2015, 19:14
    #38990044
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
Скорее всего вот эта ситуация
http://stackoverflow.com/a/10564908
...
Рейтинг: 0 / 0
22.06.2015, 20:27
    #38990098
UrvSO3000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
JulT,

Я думаю, что ты путаешь контексты сервлета и корневые контексты. Их нельзя путать. Транзакции будут работать только там, где объявлен tx:annotation-driven. Подробнее можешь прочитать вот здесь:
http://urvanov.ru/2015/06/17/spring-framework-общий-контекст-root-context-xml-и-контекст-серв/
...
Рейтинг: 0 / 0
23.06.2015, 07:39
    #38990261
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
Всем огромное спасибо за комменты, очень познавательно.
Итак, я убрала <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
23.06.2015, 07:56
    #38990265
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
Цепочка вызовов следующая.
Контроллер:
Код: 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
23.06.2015, 11:34
    #38990464
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
clientRepository - какой код ???
...
Рейтинг: 0 / 0
23.06.2015, 12:35
    #38990561
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
Atum1clientRepository - какой код ???
Код: java
1.
2.
@Repository
public interface ClientRepository extends PagingAndSortingRepository<Client, Long> {
...
Рейтинг: 0 / 0
23.06.2015, 13:32
    #38990614
Pavel Kurakin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
А если убрать @Transactional с класса?
...
Рейтинг: 0 / 0
23.06.2015, 14:20
    #38990666
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
Pavel KurakinА если убрать @Transactional с класса?
до лампочки
...
Рейтинг: 0 / 0
23.06.2015, 14:25
    #38990671
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
JulT,

Воспользуйтесь пошаговой отладкой в TransactionInterceptor, делов минут на 10.
...
Рейтинг: 0 / 0
23.06.2015, 14:32
    #38990678
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
Это просто жесть какая-то.
В этом же контроллере, с этим же сервисным классом делаю простой тестовый метод:
Код: 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
23.06.2015, 14:51
    #38990701
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с @Transactional
JulT,

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

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


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