【发布时间】:2012-03-06 00:31:33
【问题描述】:
我有一个名为“JobStatus”的游戏模型,它只有一个属性,一个带有 JobState 的枚举 (Running/notRunning)。
类扩展模型并作为单例实现。您调用它的 getInstance() 方法来获取基础表中的唯一记录。
我有一个每月运行的工作,在工作中我将在不同时间来回切换 JobStatus 对象的状态并调用 .save()。
我注意到它实际上并没有保存。
当作业开始时,它的第一行代码是
JobStatus thisJobStatus = jobStatus.getInstance();
...// exit if already running
thisJobStatus.JobState = JobState.Running;
thisJobStatus.save()
然后当作业完成时,它会将状态更改回 NotRunning 并再次保存。
问题是当我查看 MySql 数据库时,实际记录值从未改变。
这会导致灾难性故障,因为当其他节点尝试运行作业时,它们会检查状态并且由于它们将其视为 NotRunning,因此它们都尝试运行作业。
所以我管理作业状态的聪明方案失败了,因为实际值没有提交给数据库。
当我在模型上调用 .save() 时,如何强制 Play 立即写入数据库?
谢谢 乔什
【问题讨论】:
-
顺便说一句,我尝试根据 Play 的文档将该函数声明为非事务性的,但这不起作用。
-
...如果是因为交易...
-
我只是认为这可能是因为切换作业状态并将其写入数据库是在长时间运行的 Play Job 中发生的操作。
-
我尝试使用 .flush() 并没有将其提交给数据库。如果我使用刷新并提交它确实会写入数据库,但是围绕它的所有其他语句都会抛出一个异常,说明没有可用的事务。
-
Play 必须支持以 ad-hoc 方式将对象写入 DB,这真的很令人沮丧。
标签: jpa playframework