是否有一种方法可以在多个 Controller 操作之间启动“事务”,以保留模型更改,但除非所有操作都完成,否则不会保存它们?
假设我有以下用户流程:步骤 1 -> 步骤 2 -> 步骤 3 -> 步骤 4 在每个步骤中,用户都会填写一些数据,并且每个步骤都有一个“取消”按钮,需要取消向导以及之前步骤中的所有更改。
由于我们不希望每一步都将所有填充的数据传递到后续步骤,以便仅在最后一步保存到数据库 - 每一步都会创建或更改一个或多个模型实例并将它们存储在数据库中。单击“取消”时,如何恢复之前所有步骤的更改?
理想情况下,我们希望在步骤 1 中调用一些“TransactionSupport.startTransaction”,在步骤 4 中调用“TransactionSupport.endTransaction”。但考虑到每个步骤请求都可能发送到不同的 Play 服务器 - 我们如何在服务器之间存储此事务?
最佳答案
根据文档,并且知道 Play 是无状态的,这似乎不可能。事实上,如果您通过注释禁用 Play 的默认事务管理器:
@play.db.jpa.NoTransaction
然后 Play 将无法获取该请求的数据库连接。
为了解决您的问题,一种可能的解决方法是将步骤信息存储在临时表中,并仅在最后将数据提交到“工作”表。
将信息链接到用户 ID、向导 ID 和 session ID,以便您可以检测陈旧数据。
关于java - Play 中 Controller 操作之间的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9535095/