2014-09-19 4 views
0

Я сделал что-то подобное в своем проекте. Откат транзакции вручную, для этого я вставил блок try-catch и вручную откат транзакции в блоке catch. Теперь я вызываю метод2 из метода1, и я сохраняю объект в базе данных в method2(), но он не сохраняет объект в базе данных.Весна Не совершать транзакции

@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor=Throwable.class) 
@Scheduled(cron = "0 5 16 * * ?") 
public void method1() { 

try{ 
---try block--- 
} 
catch(Throwable t){ 
TransactionAspectSupport.currentTransactionStatus() 
       .setRollbackOnly(); 
method2(); 
} 
} 

@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) 
public void method2() { 
---saving object to database---- 
someService.update(object); 
} 

Я просто хочу знать, что может быть возможным решением для сохранения объекта в method2() на method1() 's faliure.

Thanx заранее.

+0

Вы выполняете метод 2 в требуемой транзакции, это потребует новой транзакции. В случае необходимости EJB создаст транзакцию, если ее еще нет, в случае, если у вас есть один, EJB будет использовать текущую транзакцию. –

+0

method2 использует транзакцию из метода1, поэтому оба метода находятся в одной транзакции. Когда метод1 откатывает транзакцию, он откатывает обновление, выполняемое в методе 2 – forgivenson

+0

@forgivenson - как я могу обновить объект в методе2()? –

ответ

0

Я считаю, что после того, как транзакция отменена (как и перед вызовом метода2()), транзакция выполняется (как в kaput), и вы не можете продолжать ее использовать и ожидать фиксации. Это должно быть новой транзакцией (например, программно):

// transactionManager is your platorm transaction manager usually injected 
TransactionTemplate transactionTempate = new TransactionTemplate(transactionManager); 

transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); 

transactionTemplate.execute(new TransactionCallbackWithoutResult() { 
      @Override 
      protected void doInTransactionWithoutResult(TransactionStatus arg0) { 
       method2(); 
      } 
     }); 
+0

@dmansifield - должен ли я написать это после TransactionAspectSupport.currentTransactionStatus() \t \t \t .setRollbackOnly(); ? потому что метод2() не вызывается. –

+0

Я бы подумал, что вы можете поместить все это в метод и вызвать его из обработчика исключений. Если я что-то не понял, случай, который вы пытаетесь исправить, заключается в том, что обновления метода2() не выполняются при вызове из обработчика исключений. – dmansfield

+0

его еще не назовешь. –

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