0

我无法理解如何在 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().end();

但收到 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();

}
4

2 回答 2

1

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

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

如果您想在说 Ebean.execute(txScope, ... 中使事务失败,则抛出异常。

于 2013-06-21T01:06:35.027 回答
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

于 2013-07-10T10:50:28.030 回答