@Transactional will work as expected only under Spring-managed thread context. As Quartz job executes in its own thread, rollback doesn't happen as expected.
Quartz job can be made sure that it is Spring managed. Also, transactional logic can be moved to services layer instead of placing @Transactional on the job class