【发布时间】:2015-07-29 14:15:21
【问题描述】:
我有一个这样的表结构:
ParentObject(ObjectId 字符串,.....)
ChildObject(ObjectId string, ParentId String, Atribute1 String, State Integer....)
有多个ParentObject记录(近1000条),每个ParentObject记录表被ChildObject表中的多条记录(近50条)引用。
我有两个并行进程在不同的机器上运行,它们使用 OCI 库调用循环执行此查询。
UPDATE ChildObject SET Attribute1='<process_name>' WHERE ObjectId = ANY
(SELECT TOP 100 ObjectId FROM ChildObject alias1 WHERE State = 0
AND NOT EXISTS
(SELECT * FROM ChildObject alias2 WHERE alias2.State = 0 AND
alias2.Attribute1 <> ' ' AND alias2.ParentId = alias1.ParentId))
语法可能并不完美。逻辑是每个进程在一次运行中更新 100 条 ChildObject 记录并将 Attribute1 设置为进程名称(如果尚未设置),休眠一段时间并再次开始更新。
我的要求是所有引用同一 ParentObject 记录的 ChildObject 记录应该由一个进程更新。例如,如果Process1更新了10条具有相同ParentId的ChildObject记录,则其余具有相同ParentId的ChildObject记录应该由Process1更新,而不是由Process2更新。
由于进程并行运行,一些 ChildObject 记录在一个进程中更新,而某些具有相同 ParentId 的 ChildObject 记录在另一个进程中更新。
Select.. For Update 在我的情况下不起作用,因为更新发生在 ChildObject 表中的不同记录上。
锁定整个 ChildObject 表可能不是一个好的解决方案。
您能否建议我如何实现这种同步?
谢谢,
瓦纳提
【问题讨论】:
标签: database oracle synchronization sql-update