2013-06-12 11 views
0

2.1.1 버전의 ebean 트랜잭션 작업 방법을 이해하는 데 문제가 있습니다.play 2.1.1 : ebean orm을 사용하여 트랜잭션을 롤백 할 수 없습니다.

Ebean.execute(txScope, new TxRunnable() { 

     public void run() { 

      Ebean.beginTransaction(); 
      System.out.println("[**] : " + Ebean.currentTransaction()); 
      User user = Ebean.find(User.class, 22); 
      user.setPassword("qweqwe125"); 
      Ebean.save(user); 

      user = Ebean.find(User.class, 22); 
      user.setPassword("qweqwe126"); 
      Ebean.rollbackTransaction(); 
      // or other case 
      //Ebean.currentTransaction().rollback(); 
     } 

하지만이 경우 오류가 발생합니다. PersistenceException : 기존 트랜잭션이 여전히 활성입니까? 내가 업데이트 된 값을받을이 경우

@Transactional(type=TxType.REQUIRES_NEW, isolation = TxIsolation.SERIALIZABLE) 
public static void transactional2() { 
    User user = User.query.getById(22l); 
    user.setPassword("qweqwe123"); 
    user.save(); 

    Ebean.endTransaction(); 
} 

:

또한 내가 좋아하는 뭔가를 만들려고했습니다. 또한 마지막 예제에서이 방법으로 롤백을 시도했습니다. Ebean.currentTransaction(). end();

그러나 NullPointerException 오류가 발생합니다.

트랜잭션이있는 실행 가능한 예를 가리킬 수 있습니까? 또는 주석에 몇 가지 예를 써보십시오.

감사합니다.

UPDATE

결국 발견했다 솔루션 : 당신이 Ebean.beginTransaction를 사용하지 말아야 한마디로

public static void transactional2() { 
    com.avaje.ebean.Ebean.beginTransaction(); 

    User user = User.query.getById(22l); 
    user.setPassword("qweqwe123"); 
    user.save(); 

    com.avaje.ebean.Ebean.rollbackTransaction(); 
    // OR: com.avaje.ebean.Ebean.commitTransaction(); 

} 

답변

0

결국 발견했다 솔루션입니다. 작품을 처리 .

public static void transactional2() { 
    com.avaje.ebean.Ebean.beginTransaction(); 

    User user = User.query.getById(22l); 
    user.setPassword("qweqwe123"); 
    user.save(); 

    com.avaje.ebean.Ebean.rollbackTransaction(); 
    // OR: com.avaje.ebean.Ebean.commitTransaction(); 
} 

이 솔루션에 문제가있을 경우 의견을 보내주십시오.

Ebean 설명서 예 : http://www.avaje.org/ebean/introtrans_begin.html

+0

Rob이 말했듯이,'begin','rollback','commit'을 직접 사용해서는 안됩니다. 당신이 가리키고있는 문제는 Ebean의 버그입니다 : https://github.com/ebean-orm/avaje-ebeanorm/pull/44. Play 버전 업그레이드를 시도하십시오 – c4k

+0

3 월 1 일의 마지막 Play 2.2.2로 업그레이드 하시겠습니까? –

+0

A) beginTransaction()을 사용하는 경우 finally에서 endTransaction()을 사용하여 finally 블록을 차단해야합니다. –

1

(); Ebean.rollbackTransaction(); 또는 Ebean.commitTransaction(); .... @Transactional 또는 Ebean.execute (txScope, new TxRunnable()).

그래서 @Transactional 메서드의 향상으로 커밋/롤백이 처리되고 유사하게 Ebean.execute (txScope, new TxRunnable() 나를 위해 당신을 위해/롤백 커밋합니다.

당신이 다음 예외를 발생 ... 말 Ebean.execute (txScope에 거래를 실패합니다.

+1

내가 잘못하면 나를 바로 잡으십시오. @Transactional 컨트롤러 액션 내부에 예외를 던지려고했습니다. 불행히도 모든 SQL 업데이트 호출이 커밋되었습니다. 연극 2.1.1의 작동 예제를 가르쳐 주시겠습니까? 의견을 주셔서 감사합니다. – slavamnemonic

+0

이것은 작동하지 않습니다. 나는'EbeanServer.execute (TxScope, TxRunnable); '을 사용하고 있으며, 예외가 발생할 경우 롤백하지 않습니다. –

+0

David, 문제의 사례를 어딘가에 넣으세요 (예 : 실패한 테스트). 당신은 https://github.com/ebean-ex-examples/example-minimal ...을 기본으로 할 수 있습니다. –