我看过this:
我的问题是:
如果我想在Job中手动管理我的交易,我该怎么办?
现在我有一个代码并在那里使用“@NoTransaction”,如上文所述:
@NoTransaction
@Override
public JobResult doJobWithResult() throws Exception {
...
JobResult result = new JobResult();
try {
//MyEntity.em().getTransaction().commit();
MyEntity.em().getTransaction().begin();
....
但是,在开始(begin())事务的那一刻,我仍然有一个错误:
java.lang.IllegalStateException:事务已处于活动状态
因此,即使我使用@NoTransaction,Job仍会启动自己的事务。
我可以这样解决:
MyEntity.em().getTransaction().commit(); // commit previous started transaction
MyEntity.em().getTransaction().begin();
但它似乎不是一个好的解决方案。
你会推荐什么?
答案 0 :(得分:2)
我发现:如果使用:
JPAPlugin.startTx(false); // to start transaction
JPAPlugin.closeTx(false); // to close and commit transaction
JPAPlugin.closeTx(true); // to roll-back transaction
而不是使用所有那些JPA的东西,然后一切正常。
所以,这对我来说是一个解决方案。但是我没有深入了解该剧如何发挥!认为/识别我是手动使用jpa还是通过插件api工作..然后决定。如果看一下startTx方法,它看起来像这样:
if (autoTxs) {
manager.getTransaction().begin();
}
JPA.createContext(manager, readonly);
这个想法是“更好地使用'想要在Play中手动管理事务的JPA-Plugin方法(因为JPA插件涉及一些后端魔法,所以最好在你的行动中接近它)