互联网上有很多关于这个常见“问题”的信息.
解决方案如:
IF NOT EXISTS() BEGIN INSERT INTO (...) END
在我看来并不是线程安全的,你可能会同意.
但是你可以确认将exists存入一个select的where子句会解决sql引擎中最高并发性的问题吗?
够了吗?
insert into Table (columns) select column1,column2,column3 where not exists (select top 1 1 from Table where something)
应该还有一些更高的交易水平或
这可以在默认的一个上执行:commit?
这会在未提交的级别下工作吗?
谢谢!
//稍后添加
我可以假设两个sql’都是正确的:
1)
设置事务隔离级别可重复读取
IF NOT EXISTS() BEGIN INSERT INTO (...) END
2)设置事务隔离级别可重复读取
insert into Table (columns) select column1,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
> NOT EXISTS将读取表格,无论是在IF还是WHERE
> INSERT需要读取以检查唯一性
如果您可以丢弃重复项,这是一种高度可扩展的技术
链接:
>请在此处查看我的答案:Only inserting a row if it’s not already there和SQL Server 2008: INSERT if not exits,maintain unique column
>如果您还需要UPDATE:Which is the best choice in delete-insert vs if-update else-insert?