play 2.1.1:无法使用ebean orm回滚事务

时间:2013-06-12 21:56:43

标签: java transactions playframework-2.1 ebean traceback

我在理解如何在play 2.1.1下使用ebean事务时遇到问题。

    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()结束();

但是收到NullPointerException错误。

有人可以指出我的交易可行的例子吗?或者在评论中写一些例子。

感谢。

更新

最终找到了解决方案:

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();

}

2 个答案:

答案 0 :(得分:1)

简而言之,你不应该使用Ebean.beginTransaction(); Ebean.rollbackTransaction();或Ebean.commitTransaction(); ....使用@Transactional或Ebean.execute(txScope,新的TxRunnable()。

因此@Transactional方法的增强为您处理提交/回滚,同样Ebean.execute(txScope,new TxRunnable()为您处理提交/回滚。

如果你想在一个事务中失败,比如Ebean.execute(txScope,...然后抛出异常。

答案 1 :(得分: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