互联网上有很多关于这个常见“问题”的信息。
解决方案如:
IF NOT EXISTS() BEGIN INSERT INTO (...) END
在我看来,它们不是线程安全的,您可能会同意。
但是你能确认将exists放入单选的where子句中就可以解决sql引擎的最高并发问题吗?
够了吗?
insert into Table (columns)
select column1, column2, column3
where not exists (select top 1 1 from Table where something)
应该还有添加一些更高的交易级别或者
这可以在默认的情况下执行吗:已提交?
这可以在未承诺的水平下工作吗?
Thanks!
//稍后添加
我可以假设两个 sql' 都是正确的吗:
1)
设置事务隔离级别可重复读
IF NOT EXISTS() BEGIN INSERT INTO (...) END
2)设置事务隔离级别可重复读
insert into Table (columns)
select column1, column2, column3
where not exists (select top 1 1 from Table where something)
使用 TRY/CATCH 您可以避免额外的读取
BEGIN TRY
INSERT etc
END TRY
BEGIN CATCH
IF ERROR_NUMBER() <> 2627
RAISERROR etc
END CATCH
- A NOT EXISTS 会读取表,无论是在 IF 还是 WHERE
- INSERT 需要读取来检查唯一性
如果您可以丢弃重复项,那么这是一种高度可扩展的技术
Links:
- 在这里查看我的答案:仅在行尚不存在时插入行 and SQL Server 2008:如果不存在则插入,维护唯一列
- 如果您也需要更新:delete-insert 与 if-update else-insert 哪个是最佳选择?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)