我有一个问题,即使用完全相同的参数在完全相同的时间调用相同的存储过程。
存储过程的目的是获取记录(如果存在)或创建并获取记录(如果不存在)。
问题是两个线程都在检查记录是否存在并报告错误,然后都插入新记录,在数据库中创建重复记录。
我尝试将操作保留在事务中,但这只会产生数百个死锁。
有什么方法可以以线程安全的方式检查记录是否存在,以便第二个线程在第一个线程完成插入之前不会进行读取?我无法控制线程本身,只能控制它们正在执行的存储过程。
任何帮助,将不胜感激,
Thanks.
诀窍是在 INSERT 语句中添加 WHERE,以便 INSERT 仅在该项目不存在时才起作用,后跟 SELECT 语句。假设记录可以通过 ID 列来标识,您可以编写:
INSERT INTO MyTable (ID,Col1,Col2,...)
SELECT @IDValue,@Col1Value,@Col2Value, ...
WHERE NOT EXISTS (SELECT ID
FROM MyTable
WHERE ID=@IDValue)
SELECT *
FROM MyTable
Where ID=@IDValue
您不需要将语句放入事务中,因为每个语句都在其自己的隐式事务中执行。因此,两个插入不可能同时成功。
EDIT:INSERT ... SELECT 语法是必需的,因为 TSQL 不允许在 INSERT 语句中包含 VALUES 和 WHERE 部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)