Java 游戏中控制器操作之间的事务

Java 游戏中控制器操作之间的事务,java,playframework,Java,Playframework,是否有一种方法可以在几个控制器操作之间启动“事务”,这些操作将保留模型更改,但除非所有操作都已完成,否则不会保存这些更改 假设我有以下用户流:step1->step2->step3->step4 在每个步骤上,用户填写一些数据,每个步骤都有一个“取消”按钮,需要取消向导以及以前步骤中的所有更改 由于我们不希望每一步都将所有填充的数据传递到下一步,以便仅在最后一步保存到数据库中,所以每一步都创建或更改一个或多个模型实例,并将它们存储在数据库中。单击“取消”时,我们如何恢复以前所有步骤中的更改 理想

是否有一种方法可以在几个控制器操作之间启动“事务”,这些操作将保留模型更改,但除非所有操作都已完成,否则不会保存这些更改

假设我有以下用户流:step1->step2->step3->step4 在每个步骤上,用户填写一些数据,每个步骤都有一个“取消”按钮,需要取消向导以及以前步骤中的所有更改

由于我们不希望每一步都将所有填充的数据传递到下一步,以便仅在最后一步保存到数据库中,所以每一步都创建或更改一个或多个模型实例,并将它们存储在数据库中。单击“取消”时,我们如何恢复以前所有步骤中的更改


理想情况下,我们希望在步骤1中调用一些“TransactionSupport.startTransaction”,在步骤4中调用一些“TransactionSupport.endTransaction”。但考虑到每个步骤请求可能会转到不同的播放服务器-我们如何在服务器之间存储此事务?

根据文档,并且知道播放是无状态的,这似乎是不可能的。事实上,如果您通过注释禁用Play via annotations的默认事务管理器,则:

@play.db.jpa.NoTransaction
那么Play将无法获得该请求的DB连接

为了解决您的问题,一种可能的解决方法是将步骤的信息存储在一个时态表中,并且只将数据提交到最后的“工作”表中


将信息链接到用户id、向导id和会话id,这样您就可以检测过时的数据。

根据文档,知道播放是无状态的,这似乎是不可能的。事实上,如果您通过注释禁用Play via annotations的默认事务管理器,则:

@play.db.jpa.NoTransaction
那么Play将无法获得该请求的DB连接

为了解决您的问题,一种可能的解决方法是将步骤的信息存储在一个时态表中,并且只将数据提交到最后的“工作”表中

将信息链接到用户id、向导id和会话id,以便检测陈旧数据