Problem z adnotacjami @ Transactional w Spring JPA

Mam wątpliwości związane z transakcjami w ramach transakcji. Dla tła mam obiekt obiektu School, który ma przypisany obiekt obiektu Set of Students. Używam Spring Data JPA, który zajmuje się wszystkimi operacjami crud. Mam klasę SchoolManagementService, która ma @Transactional (readonly = true) ustawiony na poziomie klasy i dla wszystkich metod aktualizacji, których używam @Transactional nad nimi. W mojej klasie SchoolManagementService mam metodę deleteStudents (List), którą oznaczyłem jako @Transactional. W tej metodzie ponownie wywołuję StudentsRepository.delete (studentId). Chcę się upewnić, czy jakiekolwiek usunięcie się nie powiedzie, transakcja powinna zostać wycofana dla tego sprawdzonego wyjątku. Próbuję to przetestować w moim przypadku testowym Spring Junit (nie używam domyślnego rollback = true lub @ rollback (true), ponieważ chcę, aby zostało to wycofane z powodu wyjątku czasu wykonywania napotkanego w metodzie usuwania repozytorium.

@RunWith(SpringJUnit4ClassRunner.class)   
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class, TransactionalTestExecutionListener.class})   
@ContextConfiguration(locations = {"classpath:PPLRepository-context.xml"})
public class TestClass{


@Test
@Transactional
public void testDeleteStudents(){
StudentManagementService.delete(randomList)
}

z tym testcase usuwa wszystkie rekordy, ale ostatni. W idealnej sytuacji powinno się wycofać i żaden z wpisów nie powinien zostać usunięty.

Oto mój plik ustawień sprintu z konfiguracjami TransactionMangaer

<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init"
            destroy-method="close">
            <property name="forceShutdown" value="true" />
            <property name="startupTransactionService" value="true" />
            <property name="transactionTimeout" value="1000" />
        </bean>

        <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp" />
        <!-- Configure the Spring framework to use JTA transactions from Atomikos -->
        <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
            <property name="transactionManager" ref="atomikosTransactionManager" />
            <property name="userTransaction" ref="atomikosUserTransaction" />
            <property name="transactionSynchronizationName" value="SYNCHRONIZATION_ON_ACTUAL_TRANSACTION" />
        </bean>

            <!-- EntityManager Factory that brings together the persistence unit, datasource, and JPA Vendor -->
            <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="PPL_GMR">
                <property name="dataSource" ref="PPL_GMRDS"></property>
                <property name="persistenceUnitName" value="PPL_GMR"/>
                <property name="persistenceXmlLocation" value="classpath:META-INF/PPL-persistence.xml"/>
                <property name="jpaVendorAdapter" ref="PPL_GMRJPAVendorAdapter"/>
                    <property name="jpaPropertyMap">
                        <map>
                                    <entry key="hibernate.transaction.manager_lookup_class" value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup"/> 
                                    <entry key="hibernate.connection.release_mode" value="on_close"/>
                                    <entry key="hibernate.default_schema" value="${PPL.schema}"/>
                        </map>
                    </property>
</bean>

Czy ktoś może zasugerować, gdzie źle rozumiem transakcje? Cokolwiek przeczytałem z interfejsów API, odniosłem wrażenie, że jeśli jakaś metoda jest @ Transakcyjna w warstwie usług i jeśli wywołuje kilka metod transakcyjnych repozytoriów JPA Spring Data, to jeśli napotkam wyjątek Runtime, wszystkie transakcje powinny zostać wycofane . Próbowałem nawet stworzyć metodę testcase jak poniżej:

@Test
@Transactional
public void testDeleteStudents(){
StudentRepository.delete(1);
StudentRepository.delete(2);// 2 id is not present so I will get a runtime exception.
}

Pomimo utrzymywania @Rollback (prawda / fałsz) w tej metodzie, ta metoda usuwa identyfikator 1 ucznia z bazy danych. Pomyślałem, że @Transactional w tej metodzie testcase utworzy tutaj nową transakcję, a wszystkie transakcyjne metody usuwania z StudentRepository będą uruchamiane w tej samej transakcji. Żadne dane uczniów nie zostaną zatwierdzone, dopóki nie zostanie zgłoszony wyjątek czasu wykonywania.

Pomóż mi lepiej zrozumieć transakcje, ponieważ jestem nowy. Używam Spring Data JPA z bazą danych Oracle.

Z góry dziękuję.

questionAnswers(1)

yourAnswerToTheQuestion