【发布时间】:2016-08-30 12:26:21
【问题描述】:
假设我们有一个表 A,其中包含字段 time: date、status: int、playerId: int, serverid: int
我们添加了对时间、playerid 和 serverid 的限制 (UNQ_TIME_PLAYERID_SERVERID)
有时我们尝试用新的状态和日期更新表 A 中的所有行:
更新状态 = 1, 时间 = sysdate where serverid=XXX and status != 1 and time >系统日期
问题是在不同的机器上有两个独立的进程可以在相同的 sysdate 执行相同的更新。
并且发生UNQ_TIME_PLAYERID_SERVERID违规!
是否有可能强制 Oracle 在具体更新之前检查原因(获取行锁定时)?
我不想使用任何'select for update'东西
【问题讨论】:
-
为什么会出现这个问题?只需抓住错误并忽略它。
-
我不想简单地忽略错误。是的,有可能。但我实际上想知道是否有可能编写更新该错误根本不会出现。
-
你不能。就在您得到肯定回答之后,表格(行)可以被锁定。做这种事情的唯一可靠方法是 try catch。
-
如果有 2 个具有相同 playerId 和不同时间的记录满足 where 子句怎么办?甚至一个更新查询都会达到您的约束。您可能需要重新考虑您的应用程序逻辑。
-
@MartinSchapendonk 是的,对于同一个玩家 ID,我们有 2 次或更多次可能的情况。是的,你是对的。我们在索引中有另一个字段。我会更新问题
标签: sql oracle sql-update