Problema com anotações @Transactional no Spring JPA

Eu tenho uma dúvida relacionada a transações dentro de transações. Para o plano de fundo, eu tenho um objeto de entidade School que tem o objeto de entidade Set of Students mapeado para ele. Estou usando o Spring Data JPA, que cuida de todas as operações brutas. Eu tenho uma classe SchoolManagementService que tem @Transactional (readonly = true) definido no nível de classe e para todos os métodos de atualização estou usando @Transactional sobre eles. Na minha classe SchoolManagementService eu tenho um método deleteStudents (List) que marquei como @Transactional. Neste método, estou chamando StudentsRepository.delete (studentId) novamente e novamente. Eu quero ter certeza se qualquer exclusão falhar, então a transação deve reverter para essa exceção verificada. Eu estou tentando testar isso com meu caso de teste junit de primavera (não estou usando o padrão rollback = true ou @ rollback (true) porque eu quero que isso seja revertido por causa de alguma exceção de tempo de execução que encontro no método de exclusão do repositório.

@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)
}

com este testcase está apagando todos os registros, mas o último. Idealmente, ele deve reverter e nenhuma das entradas deve ser excluída.

Aqui está o meu arquivo de configurações de sprin com as configurações do 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>

Alguém pode sugerir onde meu entendimento de transações está errado? Seja o que for que eu tenha lido nas APIs, tenho a impressão de que, se algum método é @Transactional na camada de serviço e se ele chamar vários métodos @Transactional de repositórios Spring Data JPA, se eu encontrar alguma exceção Runtime, todas as transações devem ser revertidas . Eu até tentei criar um método de teste como abaixo:

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

Apesar de manter @Rollback (true / false) nesse método, esse método exclui o id 1 Student do banco de dados. Eu pensei que @Transactional neste método testcase irá criar uma nova transação aqui e todos os métodos de exclusão transacionais do StudentRepository serão executados na mesma transação. E nenhum dado de estudante será confirmado até e a menos que nenhuma exceção de tempo de execução seja lançada.

Por favor, ajude-me a entender melhor as transações, pois sou novo nisso. Eu estou usando Spring Data JPA com banco de dados Oracle.

Desde já, obrigado.

questionAnswers(1)

yourAnswerToTheQuestion