Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringJDBC“;如果不存在,则插入“;主键约束冲突_Java_Sql Server_Spring_Sql Server 2012 - Fatal编程技术网

Java SpringJDBC“;如果不存在,则插入“;主键约束冲突

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

我有一个MSSQL数据库和一个使用Spring事务管理的JavaSpring应用程序

我有一个查询“IF NOT EXIT,INSERT..”,它是从多个线程运行的。 出于某种原因,我得到了一个主键约束冲突,即使在编写之前检查是否存在,所有这些都发生在事务内部

我想知道这是什么原因,以及如何预防

查询:

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?