我在存储过程中的插入有并发问题。该程序的相关部分是这样的:
select @_id = Id from table1 where othervalue = @_othervalue
IF( @_id IS NULL)
BEGIN
insert into table1 (othervalue) values (@_othervalue)
select @_id = Id from table1 where othervalue = @_othervalue
END
Run Code Online (Sandbox Code Playgroud)
当我们同时运行 3 个或 4 个这些存储过程时,我们有时会得到多个插入。
我打算像这样解决这个问题:
insert into table1 (othervalue)
select TOP(1) @_othervalue as othervalue from table1 WITH(UPDLOCK)
where NOT EXISTS ( select * from table1 where othervalue = @_othervalue )
select @_id = Id from table1 where othervalue = @_othervalue
Run Code Online (Sandbox Code Playgroud)
问题是,如何在sql server中并发插入而不重复?我必须使用 TOP 只插入一次的事实让我感到不安。
我最近被一个错误(在我的代码中)所困扰,其中这两个查询的运行时截然不同:
select * from smalltable st
inner join bigtable bt on st.btid = bt.btid
select * from bigtable bt
inner join smalltable st on bt.btid = st.btid
Run Code Online (Sandbox Code Playgroud)
以及单个查询在 where 过滤器中为不同的字符串寻找不同的执行计划。
是否有任何优化的、完全声明性的 SQL 标准实现,以便上述两个查询具有相同的执行计划?