【问题标题】:Objectify transaction rollback not happening对象化事务回滚没有发生
【发布时间】:2015-05-02 10:53:37
【问题描述】:

当我故意在 Objectify 事务中抛出异常时,我的事务不会被回滚。我做错了什么?

        @Inject 
        Dao dao
        ...
        public void testTransaction(){
            dao.transact(new VoidWork() {
            @Override
            public void vrun() {
                Key aclKey= dao.save().entity(acl).now(); //expecting this to be rolled back
                //throw exception
                if(true) throw new IllegalArgumentException();
                //expecting rollback of acl save
            }

            });
        }

我正在使用这样的设置:

@Singleton
public class DaoFactory extends ObjectifyFactory {
    private Injector injector;

    @Inject
    public DaoFactory(Injector injector) {
        this.injector = injector;
        registerEntities();
    }

    private void registerEntities() {
    }

    @Override
    public <T> T construct(Class<T> type) {
        return injector.getInstance(type);
    }

    @Override
    public Objectify begin() {
        Dao dao = new Dao(this);
        return dao;
    }
}

地点:

public class Dao extends ObjectifyImpl<Dao> {
    @Inject
    public Dao(ObjectifyFactory fact) {
        super(fact);
    }
}

public class DaoService {
    @Inject
    public static void setObjectifyFactory(DaoFactory fact) {
        ObjectifyService.setFactory(fact);
    }
}

都是使用 Guice for DI 注入的。

我单步执行了代码,objectify 确实在 TransactorNo.class 中调用了 txnOfy.getTransaction().rollback();

但是,当我检查 app-engine 本地数据库时,我看到一个为 acl 创建的实体(有时需要几秒钟的时间才能显示出来)

【问题讨论】:

    标签: objectify google-cloud-datastore


    【解决方案1】:

    事务状态附加到特定的 ObjectifyImpl 实例。您正在启动一个事务(通过静态 ofy() 方法提供一个新的 ObjectifyImpl),然后重新使用旧的、非事务性的 ObjectifyImpl 实例。

    因此,即使您正在回滚事务,您的保存操作也使用了来自事务外部的非事务性 Objectify impl。

    这就是为什么文档建议您永远不要在变量中保留 Objectify 实例的原因;始终使用静态ofy() 方法。您可以创建自己的静态 ofy() (或其他)方法来返回您的 Dao 类型。查看http://www.motomapia.com/的示例代码

    由于事务和会话状态是线程本地问题,因此注入持久性上下文只是一个坏主意,即使在 JPA 下也是如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 2018-07-05
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多