【发布时间】:2015-06-24 17:05:34
【问题描述】:
我的ORACLE 数据库中有一个表INFO_TABLE 有3 个字段(id, param1, param2)
我使用这个表的方式如下
`1) SELECT ID FROM INFO_TABLE WHERE param1 = ? param2 = ?` <br>
2) IF ROW EXISTS, THEN I USE IT <br>
3) if row does not exist i execute this query :
INSERT INTO INFO VALUES (INFO_SEQ.NEXTVAL, 'val1', 'val2' and return the generated id for this row
问题是,当我在并发模式下执行此操作时,有机会将 ('val1', 'val2') 的重复值对插入到表中。
有什么办法可以将表锁定在WHERE 谓词上以避免这种情况?
我不想为此操作锁定整个表,并且我不能使用唯一约束。
我需要SELECT FOR UPDATE 之类的东西(这个不起作用,因为还没有要锁定的行)查询
【问题讨论】:
-
为什么
val1、val2对没有唯一索引? -
如果您告诉我们为什么无法使用唯一约束,则可能有解决方法。例如,如果您需要保持某些历史值不唯一,但希望对所有未来值应用唯一性,则可以通过将索引创建为
novalidate来实现。类似的例子见我的回答here。