问题
I have problem with understanding how to work with ebean transactions under play 2.1.1.
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();
}
But in this case I receive error: PersistenceException: The existing transaction still active?
Also I've try to make something like:
@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();
}
In this case I receive updated values. Also in last example I've try rollback in this way: Ebean.currentTransaction().end();
But receive NullPointerException error.
Could some one point me to workable example with transactions? Or write some example in comments.
Thanks.
UPDATE
Eventually have found solution:
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();
}
回答1:
In short you shouldn't use Ebean.beginTransaction(); Ebean.rollbackTransaction(); or Ebean.commitTransaction(); .... with either @Transactional or Ebean.execute(txScope, new TxRunnable().
So the enhancement of the @Transactional method handles the commit/rollback for you and similarly the Ebean.execute(txScope, new TxRunnable() handles the commit/rollback for you.
If you want to fail a transaction in say Ebean.execute(txScope, ... then throw an exception.
回答2:
Eventually have found solution. Works for me.
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();
}
Please add you comments if something wrong with this solution.
Ebean documentation example: http://www.avaje.org/ebean/introtrans_begin.html
来源:https://stackoverflow.com/questions/17076055/play-2-1-1-unable-to-rollback-transaction-with-ebean-orm