【发布时间】:2017-02-15 06:51:04
【问题描述】:
我有一个 Items 和 Jobs 表:
项目
- id = PK
- job_id = Jobs FK
- 状态 = IN_PROGRESS |完成
工作
- id = PK
项目以 IN_PROGRESS 开始,但对它们执行工作,并移交给工作人员进行更新。我有一个更新程序,它在项目进入时更新项目,并具有新状态。到目前为止我一直在做的方法是(在伪代码中):
def work(item: Item) = {
insideTransaction {
updateItemWithNewStatus(item)
jobs, items = getParentJobAndAllItems(item)
newJobStatus = computeParentJobStatus(jobs, items)
// do some stuff depending on newJobStatus
}
}
这有意义吗?我希望它在并发环境中工作。我现在遇到的问题是,当我只想在 COMPLETE 上执行一次逻辑时,COMPLETE 会多次到达。
如果我将事务级别更改为 SERIALIZABLE,我确实收到“错误:由于事务之间的读/写依赖关系而无法序列化访问”错误。
所以我的问题是:
- 我需要 SERIALIZABLE 吗?
- 我可以不使用 SELECT FOR UPDATE 吗?在哪里?
- 谁能向我解释发生了什么,为什么?
编辑:我重新打开了这个问题,因为我对之前的答案解释不满意。有人能为我解释一下吗?具体来说,我想要一些针对该伪代码的示例查询。
【问题讨论】:
标签: sql postgresql transactions