Java SpringJDBC“;如果不存在,则插入“;主键约束冲突
我有一个MSSQL数据库和一个使用Spring事务管理的JavaSpring应用程序 我有一个查询“IF NOT EXIT,INSERT..”,它是从多个线程运行的。 出于某种原因,我得到了一个主键约束冲突,即使在编写之前检查是否存在,所有这些都发生在事务内部 我想知道这是什么原因,以及如何预防 查询:Java SpringJDBC“;如果不存在,则插入“;主键约束冲突,java,sql-server,spring,sql-server-2012,Java,Sql Server,Spring,Sql Server 2012,我有一个MSSQL数据库和一个使用Spring事务管理的JavaSpring应用程序 我有一个查询“IF NOT EXIT,INSERT..”,它是从多个线程运行的。 出于某种原因,我得到了一个主键约束冲突,即使在编写之前检查是否存在,所有这些都发生在事务内部 我想知道这是什么原因,以及如何预防 查询: IF NOT EXISTS (SELECT docId FROM documentStatus WHERE docId='abc') BEGIN INSERT INTO documentSta
IF NOT EXISTS (SELECT docId FROM documentStatus WHERE docId='abc')
BEGIN INSERT INTO documentStatus
VALUES ('abc',1,0,NULL)
END
ELSE
BEGIN
UPDATE documentStatus SET documentStatus.count=documentStatus.count+1
WHERE docId ='abc'
END;
文档状态的DDL
CREATE TABLE Dss.dbo.docStatus
(
docId NVARCHAR(256),
count INT NOT NULL DEFAULT 1,
error INT NOT NULL DEFAULT 0,
errorMsg NVARCHAR(1024) DEFAULT NULL,
CONSTRAINT PK_docStatus PRIMARY KEY (docId ASC)
)
DDL
-
USE tempdb
GO
IF OBJECT_ID('dbo.docStatus', 'U') IS NOT NULL
DROP TABLE dbo.docStatus
GO
CREATE TABLE dbo.docStatus (
docId NVARCHAR(256) PRIMARY KEY,
[count] INT NOT NULL DEFAULT 1,
error INT NOT NULL DEFAULT 0,
errorMsg NVARCHAR(1024)
)
你的榜样-
IF NOT EXISTS (
SELECT docId
FROM docStatus
WHERE docId = N'abc'
)
BEGIN
INSERT INTO dbo.docStatus (docId) VALUES (N'abc')
END
ELSE
BEGIN
UPDATE docStatus
SET [count] += 1
WHERE docId = N'abc'
END
MERGE
语句-
;WITH cte AS
(
SELECT *
FROM dbo.docStatus
WHERE docId = N'abc'
)
MERGE cte t
USING (
SELECT docId = N'abc'
) s ON s.docId = t.docId
WHEN MATCHED
THEN
UPDATE SET t.[count] += 1
WHEN NOT MATCHED BY TARGET
THEN
INSERT (docId, [count])
VALUES (s.docId, 1);
请提供您的问题帮助了解堆栈溢出请阅读并改进您的问题。您能否详细说明为什么这样可以防止违规?或者为什么会发生这种情况?请为
documentStatus
提供DDL
和索引。我添加了DDL,你说的“带索引”是什么意思?我在你的代码中没有看到任何问题。检查隔离级别
。“索引”-我指的是聚集索引和非聚集索引。请解释为什么更改我的DDL?