我对select for update查询是否将锁定不存在的行感兴趣。
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上的行为感兴趣。
在Oracle中,SELECT … FOR UPDATE对不存在的行不起作用(该语句仅引发“未找到数据”异常)。INSERT语句将防止重复唯一/主键值。任何其他尝试插入相同键值的事务都将阻塞,直到第一个事务提交(此时阻塞的事务将得到重复的密钥错误)或回滚(此时阻塞的事务继续)。