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();
}
Rob이 말했듯이,'begin','rollback','commit'을 직접 사용해서는 안됩니다. 당신이 가리키고있는 문제는 Ebean의 버그입니다 : https://github.com/ebean-orm/avaje-ebeanorm/pull/44. Play 버전 업그레이드를 시도하십시오 – c4k
3 월 1 일의 마지막 Play 2.2.2로 업그레이드 하시겠습니까? –
A) beginTransaction()을 사용하는 경우 finally에서 endTransaction()을 사용하여 finally 블록을 차단해야합니다. –