2016-02-12 3 views
2

Сначала я хочу сказать, что я видел все темы здесь, в stackoverflow для моего дела, но так и не смог решить мою проблему.Невозможно совершить транзакцию JPA - RollbackException: транзакция, отмеченная как rollbackOnly

мне нужно запустить запланированное задание каждую ночь, чтобы проверить погоду задача была закончена или нет - я делаю так:

@Service 
@Transactional 
public class CronBackGroundProcess { 

@Autowired 
private CronJobService cronJobService; 

@Scheduled(cron = "15 01 01 ? * *") 
public void StartNightJob() { 
    CronJobLog log = new CronJobLog(); 
    int count = 0; 
    try { 
     log.setStartTime(new Date()); 
     log.setStatus("Entered StartNightJob Function"); 
     cronJobService.saveCronJobLog(log); 

     List<Task> Tasks = cronJobService.getActive_AND_InArreasTasks(); 
     log.setStatus("Grabbed List of tasks to Check"); 
     cronJobService.saveCronJobLog(log); 

     for (Task Task : Tasks) { 
      cronJobService.StartNightJobProcess(Task, true); 
      count++; 
     } 
    } catch (Exception e) { 
     CronJobLog log2 = new CronJobLog(); 
     log2.setStatus("Error Occurred " + new Date().toString() + e.getMessage()); 
     cronJobService.saveCronJobLog(log2); 
    } 

    log.setLoansChecked(count); 
    log.setStatus("Finished"); 
    log.setEndDate(new Date()); 
    cronJobService.saveCronJobLog(log); 
} 
} 

сам CronJobService является @Transactional и autowires несколько @Transactional услуги

@Service 
@Transactional 
public class CronJobService { 

@Autowired 
private ProductService productService; 

@Autowired 
private RepaymentService repaymentService; 

@Autowired 
private CronJobLogDAO cronJobLogDAO; 


@Autowired 
private TransferService transferService; 

public String StartNightJobProcess(Account account, boolean makeTransfers) { 

    do something.... 
      } 
     } 
    } 

процесс идет без ошибок и, когда все сделки должны быть совершены я получаю такую ​​ошибку:

org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly 
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:524) ~[spring-orm-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757) ~[spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726) ~[spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:478) ~[spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:272) ~[spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) ~[spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:646) ~[spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
at ge.shemo.services.core.CronBackGroundProcess$$EnhancerByCGLIB$$30cdcf31.StartNightJob(<generated>) ~[spring-core-4.0.0.RELEASE.jar:na] 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_79] 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_79] 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_79] 
at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_79] 
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65) ~[spring-context-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81) [spring-context-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [na:1.7.0_79] 
at java.util.concurrent.FutureTask.run(FutureTask.java:262) [na:1.7.0_79] 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178) [na:1.7.0_79] 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292) [na:1.7.0_79] 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_79] 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_79] 
at java.lang.Thread.run(Thread.java:745) [na:1.7.0_79] 
Caused by: javax.persistence.RollbackException: Transaction marked as rollbackOnly 
at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:58) ~[hibernate-entitymanager-5.0.1.Final.jar:5.0.1.Final] 
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:515) ~[spring-orm-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
... 22 common frames omitted 

Я не могу понять, почему. Кроме того, если я запускаю же функцию от @Controller она отлично работает

@Controller 
@RequestMapping("/test") 
public class test { 

@Autowired 
private ClientService clientService; 

@Autowired 
private CronBackGroundProcess cronBackGroundProcess; 

@RequestMapping(value = "/test") 
@ResponseBody 
public void test() throws Exception { 
    try { 

     cronBackGroundProcess.StartNightJob(); 
    } catch (Exception e) { 
     String s = "sd"; 
    } 
    } 
} 

Так что мой вопрос, почему эта функция работает от контроллера - совершает все, как ожидается, и не работает от запланированного задания (проходит через весь процесс без ошибок)?

+0

Это полный стек? – Kayaman

+0

yes it full stack trace – Irakli

+0

Ваша транзакция отмечена как rollbackOnly', потому что произошла ошибка, произошедшая незадолго до этого, развращая соединение. Посмотрите более внимательно в своих журналах, чтобы найти исключение, даже включите дополнительное ведение журнала, если это необходимо (только необходимо, если вы где-то поймали это исключение и не распечатали его). –

ответ

5

Если вы можете, положите отладочную точку останова в org.springframework.transaction.interceptor.TransactionAspectSupport.completeTra‌​nsactionAfterThrowing(TransactionInfo txInfo, Throwable ex), а затем посмотрите, каково фактическое исключение.

0

Вам не нужен знак CronBackGroundProcess в @Transactional, потому что в StartNightJob() методе вы не имеете доступ к БД всему доступа к БД, как я предполагаю, что вы выполняете в CronJobService.

Поэтому удалите @Transactional с CronBackGroundProcess, и это должно помочь.

Смежные вопросы