为什么即使抛出异常数据也没有从数据库回滚我设置了rollbackFor = Exception.class,当第二次访问被放入数据库时它仍然没有回滚数据 .

@EnableTransactionManagement
     @Service
            public class VisitService {

                private final static Logger logger = LoggerFactory.getLogger(VisitService.class);

                private final VisitRepository visitRepository;

                public VisitService(VisitRepository visitRepository) {
                    this.visitRepository = visitRepository;
                }


                public List<Visit> findAllByDate(LocalDateTime date){


                    return  visitRepository.findAllByDate(date);
                }

                @Transactional(isolation = Isolation.READ_COMMITTED, rollbackFor = RuntimeException.class, propagation = Propagation.REQUIRED)
                public Visit save(@Valid Visit visit) {
                    logger.info("Inside visitService");
                    visit.setPayed(false);
                    if (visit.getPrice().intValue() > 1000)
                        visit.setDiscount(new BigDecimal(0.05));
                    else visit.setDiscount(new BigDecimal(0.00));



                    visitRepository.save(visit);
                    if(findAllByDate(visit.getDate()).size()>1)
                        throw new RuntimeException();


                    return  null;

                }

            }

尝试配置到事务

@Configuration
    @ConditionalOnClass({PlatformTransactionManager.class})
    @AutoConfigureAfter({JtaAutoConfiguration.class, HibernateJpaAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, Neo4jDataAutoConfiguration.class})
    @EnableConfigurationProperties({TransactionProperties.class})
    public class TransactionAutoConfiguration {

    }

堆栈跟踪的一部分

2018-12-08 23:16:23.653 TRACE 3360 --- [nio-8080-exec-2] o.s.t.i.TransactionInterceptor           : Getting transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]
Hibernate: insert into visits (visit_date, description, discount, payed, pet_id, price, vet_id) values (?, ?, ?, ?, ?, ?, ?)
2018-12-08 23:16:23.663 TRACE 3360 --- [nio-8080-exec-2] o.s.t.i.TransactionInterceptor           : Completing transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]
2018-12-08 23:16:23.664 TRACE 3360 --- [nio-8080-exec-2] o.s.t.i.TransactionInterceptor           : Getting transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAllByDate]
Hibernate: select visit0_.id as id1_6_, visit0_.visit_date as visit_da2_6_, visit0_.description as descript3_6_, visit0_.discount as discount4_6_, visit0_.payed as payed5_6_, visit0_.pet_id as pet_id6_6_, visit0_.price as price7_6_, visit0_.vet_id as vet_id8_6_ from visits visit0_ where visit0_.visit_date=?
2018-12-08 23:16:23.685 TRACE 3360 --- [nio-8080-exec-2] o.s.t.i.TransactionInterceptor           : Completing transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAllByDate]
2018-12-08 23:16:23.685 TRACE 3360 --- [nio-8080-exec-2] o.s.t.i.TransactionInterceptor           : Completing transaction for [org.springframework.samples.petclinic.services.VisitService.save] after exception: java.lang.RuntimeException
2018-12-08 23:16:23.685 TRACE 3360 --- [nio-8080-exec-2] o.s.t.i.RuleBasedTransactionAttribute    : Applying rules to determine whether transaction should rollback on java.lang.RuntimeException
2018-12-08 23:16:23.685 TRACE 3360 --- [nio-8080-exec-2] o.s.t.i.RuleBasedTransactionAttribute    : Winning rollback rule is: RollbackRuleAttribute with pattern [java.lang.RuntimeException]
2018-12-08 23:16:23.690 DEBUG 3360 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Failed to complete request: java.lang.RuntimeException
2018-12-08 23:16:23.698 ERROR 3360 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException] with root cause

java.lang.RuntimeException: null

有一个带有默认注释的visitRepository

VisitRepository:

public interface VisitRepository extends Repository<Visit, Integer> {


    Visit save(Visit visit) throws DataAccessException;

    List<Visit> findByPetId(Integer petId);

    Visit findById(Integer visitId);

    @Transactional(readOnly = true)
    List<Visit> findAllByDate(LocalDateTime date);

    Visit findByDate(LocalDateTime date);

}