一尘不染

当行不存在时,“选择更新”是否会阻止其他连接插入

sql

我对select for update查询是否将锁定不存在的行感兴趣。

例如

表FooBar具有两列foo和bar,foo具有唯一索引

  • 问题查询 select bar from FooBar where foo = ? for update
  • 如果查询返回零行
    • 问题查询 insert into FooBar (foo, bar) values (?, ?)

现在,插入是否有可能导致索引冲突,或者可以select for update防止这种情况发生?

对SQLServer(2005/8),Oracle和MySQL上的行为感兴趣。


阅读 130

收藏
2021-03-17

共1个答案

一尘不染

在Oracle中,SELECT … FOR
UPDATE对不存在的行不起作用(该语句仅引发“未找到数据”异常)。INSERT语句将防止重复唯一/主键值。任何其他尝试插入相同键值的事务都将阻塞,直到第一个事务提交(此时阻塞的事务将得到重复的密钥错误)或回滚(此时阻塞的事务继续)。

2021-03-17