【发布时间】:2016-12-06 23:40:23
【问题描述】:
我对 Oracle 中的锁定主题感到困惑。根据我的研究,您可以使用FOR UPDATE NOWAIT/WAIT 锁定行。
我想以这种方式实现我的锁定。一旦我发出FOR UPDATE,该行将被锁定,我可以检查突变。我有一个 versionNumber 列,每次更新表时都会增加 1。我可以使用这个 versionNumber 来验证该行是否发生了变异?像
if (:new.versionNum != :old.versionNum)
raise_application_error(20000, 'Mutated');
end if;
我的问题是我在哪里实际编写代码行FOR UPDATE?我制作了一个小 GUI 来处理更改名字并将它们保存回数据库。这是在该表上的 oracle 上的触发器中完成的,还是在我的 JDBC 客户端一侧完成的?
任何澄清都会很好!
谢谢
【问题讨论】:
-
SELECT FOR UPDATE 但我不认为这是一个乐观锁定...
-
哦,真的吗?你能详细说明选择更新吗?我以为这锁定了行?
-
@wonderBoy322 它确实锁定了行,但我会考虑悲观锁定。这是“悲观的”,因为当您非常确定其他人会尝试修改同一行时,您会使用它。与“乐观”相比,并假设没有其他人会修改同一行,因此您完成所有工作,然后在最后检查某种标志以确保没有其他人更改任何内容。
-
通常情况下,您可以使用某种版本字段并更新
WHERE VERSION = :oldVersion。 -
感谢您的所有意见!我仍然对我实际上会在哪里写这个感到困惑?我的 JDBC 程序处理使用用户输入的新地址信息更新我的表。我会在我的数据库上写一个触发器说
BEFORE UPDATE检查类似于@chrylis所说的版本吗?