Pau*_*aul 7 sql-server transactions insert exists
互联网上有很多关于这个常见"问题"的信息.
解决方案如:
IF NOT EXISTS() BEGIN INSERT INTO (...) END
Run Code Online (Sandbox Code Playgroud)
在我看来并不是线程安全的,你可能会同意.
但是你能否确认将exists存入一个select的where子句会解决sql引擎中最高并发性的问题?够了吗?
insert into Table (columns)
select column1, column2, column3
where not exists (select top 1 1 from Table where something)
Run Code Online (Sandbox Code Playgroud)
应该在那里还添加了一些更高的事务级别,还是可以在默认的一个上执行:commit?
这会在未提交的水平下工作吗?
谢谢!
//稍后添加
我可以假设两个sql'都是正确的:
1)设置事务隔离级别可重复读取
IF NOT EXISTS() BEGIN INSERT INTO (...) END
Run Code Online (Sandbox Code Playgroud)
2)设置事务隔离级别可重复读取
insert into Table (columns)
select column1, column2, column3
where not exists (select top 1 1 from Table where something)
Run Code Online (Sandbox Code Playgroud)
使用TRY/CATCH可以避免额外的读取
BEGIN TRY
INSERT etc
END TRY
BEGIN CATCH
IF ERROR_NUMBER() <> 2627
RAISERROR etc
END CATCH
Run Code Online (Sandbox Code Playgroud)
如果您可以丢弃重复项,这是一种高度可扩展的技术
链接:
| 归档时间: |
|
| 查看次数: |
4835 次 |
| 最近记录: |